Compare commits

...
Author SHA1 Message Date
Will Schurman 378ba974de update CHANGELOG.md 2022-09-01 01:51:13 +00:00
Will Schurman 2faed15944 [eas-cli] Use discriminated union type for BuildContext 2022-08-31 15:38:36 -07:00
14 changed files with 96 additions and 114 deletions

No files matched your search

+2
View File
@@ -12,6 +12,8 @@ This is the log of notable changes to EAS CLI and related packages.
### 🧹 Chores
- Use discriminated union type for BuildContext. ([#1330](https://github.com/expo/eas-cli/pull/1330) by [@wschurman](https://github.com/wschurman))
## [1.2.0](https://github.com/expo/eas-cli/releases/tag/v1.2.0) - 2022-08-29
### 🎉 New features
+7 -7
View File
@@ -22,7 +22,7 @@ import {
JobData,
prepareBuildRequestForPlatformAsync,
} from '../build';
import { AndroidBuildContext, BuildContext, CommonContext } from '../context';
import { AndroidBuildContext, AndroidCommonContext, BuildContextAndroid } from '../context';
import { transformMetadata } from '../graphql';
import { logCredentialsSource } from '../utils/credentials';
import { checkGoogleServicesFileAsync, checkNodeEnvVariable } from '../validate';
@@ -32,7 +32,7 @@ import { syncProjectConfigurationAsync } from './syncProjectConfiguration';
import { resolveRemoteVersionCodeAsync } from './version';
export async function createAndroidContextAsync(
ctx: CommonContext<Platform.ANDROID>
ctx: AndroidCommonContext
): Promise<AndroidBuildContext> {
const { buildProfile } = ctx;
@@ -77,11 +77,11 @@ This means that it will most likely produce an AAB and you will not be able to i
}
export async function prepareAndroidBuildAsync(
ctx: BuildContext<Platform.ANDROID>
ctx: BuildContextAndroid
): Promise<BuildRequestSender> {
return await prepareBuildRequestForPlatformAsync({
ctx,
ensureCredentialsAsync: async (ctx: BuildContext<Platform.ANDROID>) => {
ensureCredentialsAsync: async (ctx: BuildContextAndroid) => {
return await ensureAndroidCredentialsAsync(ctx);
},
syncProjectConfigurationAsync: async () => {
@@ -95,7 +95,7 @@ export async function prepareAndroidBuildAsync(
});
},
prepareJobAsync: async (
ctx: BuildContext<Platform.ANDROID>,
ctx: BuildContextAndroid,
jobData: JobData<AndroidCredentials>
): Promise<Job> => {
return await prepareJobAsync(ctx, jobData);
@@ -118,12 +118,12 @@ export async function prepareAndroidBuildAsync(
});
}
function shouldProvideCredentials(ctx: BuildContext<Platform.ANDROID>): boolean {
function shouldProvideCredentials(ctx: BuildContextAndroid): boolean {
return !ctx.buildProfile.withoutCredentials;
}
async function ensureAndroidCredentialsAsync(
ctx: BuildContext<Platform.ANDROID>
ctx: BuildContextAndroid
): Promise<CredentialsResult<AndroidCredentials> | undefined> {
if (!shouldProvideCredentials(ctx)) {
return;
@@ -7,7 +7,7 @@ import { AndroidCredentials } from '../../credentials/android/AndroidCredentials
import { getUsername } from '../../project/projectUtils';
import { ensureLoggedInAsync } from '../../user/actions';
import { getVcsClient } from '../../vcs';
import { BuildContext } from '../context';
import { BuildContextAndroid } from '../context';
interface JobData {
projectArchive: ArchiveSource;
@@ -20,10 +20,7 @@ const cacheDefaults = {
cacheDefaultPaths: true,
};
export async function prepareJobAsync(
ctx: BuildContext<Platform.ANDROID>,
jobData: JobData
): Promise<Job> {
export async function prepareJobAsync(ctx: BuildContextAndroid, jobData: JobData): Promise<Job> {
const username = getUsername(ctx.exp, await ensureLoggedInAsync());
const buildProfile: BuildProfile<Platform.ANDROID> = ctx.buildProfile;
const projectRootDirectory =
+12 -18
View File
@@ -46,14 +46,12 @@ export interface JobData<Credentials> {
projectArchive: ArchiveSource;
}
interface Builder<TPlatform extends Platform, Credentials, TJob extends Job> {
ctx: BuildContext<TPlatform>;
interface Builder<Credentials, TJob extends Job> {
ctx: BuildContext;
ensureCredentialsAsync(
ctx: BuildContext<TPlatform>
): Promise<CredentialsResult<Credentials> | undefined>;
syncProjectConfigurationAsync(ctx: BuildContext<TPlatform>): Promise<void>;
prepareJobAsync(ctx: BuildContext<TPlatform>, jobData: JobData<Credentials>): Promise<Job>;
ensureCredentialsAsync(ctx: BuildContext): Promise<CredentialsResult<Credentials> | undefined>;
syncProjectConfigurationAsync(ctx: BuildContext): Promise<void>;
prepareJobAsync(ctx: BuildContext, jobData: JobData<Credentials>): Promise<Job>;
sendBuildRequestAsync(
appId: string,
job: TJob,
@@ -64,17 +62,15 @@ interface Builder<TPlatform extends Platform, Credentials, TJob extends Job> {
export type BuildRequestSender = () => Promise<BuildFragment | undefined>;
function resolveBuildParamsInput<T extends Platform>(ctx: BuildContext<T>): BuildParamsInput {
function resolveBuildParamsInput(ctx: BuildContext): BuildParamsInput {
return {
resourceClass: ctx.resourceClass,
};
}
export async function prepareBuildRequestForPlatformAsync<
TPlatform extends Platform,
Credentials,
TJob extends Job
>(builder: Builder<TPlatform, Credentials, TJob>): Promise<BuildRequestSender> {
export async function prepareBuildRequestForPlatformAsync<Credentials, TJob extends Job>(
builder: Builder<Credentials, TJob>
): Promise<BuildRequestSender> {
const { ctx } = builder;
const credentialsResult = await withAnalyticsAsync(
async () => await builder.ensureCredentialsAsync(ctx),
@@ -163,9 +159,7 @@ function handleBuildRequestError(error: any, platform: Platform): never {
throw error;
}
async function uploadProjectAsync<TPlatform extends Platform>(
ctx: BuildContext<TPlatform>
): Promise<string> {
async function uploadProjectAsync(ctx: BuildContext): Promise<string> {
let projectTarballPath;
try {
return await withAnalyticsAsync(
@@ -207,8 +201,8 @@ async function uploadProjectAsync<TPlatform extends Platform>(
}
}
async function sendBuildRequestAsync<TPlatform extends Platform, Credentials, TJob extends Job>(
builder: Builder<TPlatform, Credentials, TJob>,
async function sendBuildRequestAsync<Credentials, TJob extends Job>(
builder: Builder<Credentials, TJob>,
job: TJob,
metadata: Metadata,
buildParams: BuildParamsInput
+18 -6
View File
@@ -11,7 +11,9 @@ import { XcodeBuildContext } from '../project/ios/scheme';
import { Actor } from '../user/User';
import { LocalBuildOptions } from './local';
export type CommonContext<T extends Platform> = Omit<BuildContext<T>, 'android' | 'ios'>;
export type AndroidCommonContext = Omit<BuildContextAndroid, 'android'>;
export type IosCommonContext = Omit<BuildContextIos, 'ios'>;
export type CommonContext = AndroidCommonContext | IosCommonContext;
export interface AndroidBuildContext {
applicationId: string;
@@ -27,10 +29,9 @@ export interface IosBuildContext {
buildNumberOverride?: string;
}
export interface BuildContext<T extends Platform> {
interface BuildContextBase {
accountName: string;
easJsonCliConfig: EasJson['cli'];
buildProfile: BuildProfile<T>;
buildProfileName: string;
resourceClass: BuildResourceClass;
clearCache: boolean;
@@ -40,7 +41,6 @@ export interface BuildContext<T extends Platform> {
nonInteractive: boolean;
noWait: boolean;
runFromCI: boolean;
platform: T;
projectDir: string;
projectId: string;
projectName: string;
@@ -48,6 +48,18 @@ export interface BuildContext<T extends Platform> {
trackingCtx: TrackingContext;
user: Actor;
workflow: Workflow;
android: T extends Platform.ANDROID ? AndroidBuildContext : undefined;
ios: T extends Platform.IOS ? IosBuildContext : undefined;
}
export interface BuildContextAndroid extends BuildContextBase {
buildProfile: BuildProfile<Platform.ANDROID>;
platform: Platform.ANDROID;
android: AndroidBuildContext;
}
export interface BuildContextIos extends BuildContextBase {
buildProfile: BuildProfile<Platform.IOS>;
platform: Platform.IOS;
ios: IosBuildContext;
}
export type BuildContext = BuildContextAndroid | BuildContextIos;
+7 -7
View File
@@ -15,7 +15,7 @@ import { resolveWorkflowAsync } from '../project/workflow';
import { findAccountByName } from '../user/Account';
import { ensureLoggedInAsync } from '../user/actions';
import { createAndroidContextAsync } from './android/build';
import { BuildContext, CommonContext } from './context';
import { AndroidCommonContext, BuildContext, IosCommonContext } from './context';
import { createIosContextAsync } from './ios/build';
import { LocalBuildOptions } from './local';
@@ -43,7 +43,7 @@ export async function createBuildContextAsync<T extends Platform>({
projectDir: string;
resourceClass: BuildResourceClass;
message?: string;
}): Promise<BuildContext<T>> {
}): Promise<BuildContext> {
const exp = getExpoConfig(projectDir, { env: buildProfile.env });
const user = await ensureLoggedInAsync();
@@ -80,7 +80,7 @@ export async function createBuildContextAsync<T extends Platform>({
};
Analytics.logEvent(BuildEvent.BUILD_COMMAND, trackingCtx);
const commonContext: CommonContext<T> = {
const commonContext = {
accountName,
buildProfile,
buildProfileName,
@@ -103,17 +103,17 @@ export async function createBuildContextAsync<T extends Platform>({
runFromCI,
};
if (platform === Platform.ANDROID) {
const common = commonContext as CommonContext<Platform.ANDROID>;
const common = commonContext as AndroidCommonContext;
return {
...common,
android: await createAndroidContextAsync(common),
} as BuildContext<T>;
};
} else {
const common = commonContext as CommonContext<Platform.IOS>;
const common = commonContext as IosCommonContext;
return {
...common,
ios: await createIosContextAsync(common),
} as BuildContext<T>;
};
}
}
+6 -10
View File
@@ -1,4 +1,4 @@
import { Ios, Job, Metadata, Platform, Workflow } from '@expo/eas-build-job';
import { Ios, Job, Metadata, Workflow } from '@expo/eas-build-job';
import { AppVersionSource } from '@expo/eas-json';
import { IosCredentials } from '../../credentials/ios/types';
@@ -8,7 +8,7 @@ import { ensureBundleIdentifierIsDefinedForManagedProjectAsync } from '../../pro
import { resolveXcodeBuildContextAsync } from '../../project/ios/scheme';
import { findApplicationTarget, resolveTargetsAsync } from '../../project/ios/target';
import { BuildRequestSender, JobData, prepareBuildRequestForPlatformAsync } from '../build';
import { BuildContext, CommonContext, IosBuildContext } from '../context';
import { BuildContextIos, IosBuildContext, IosCommonContext } from '../context';
import { transformMetadata } from '../graphql';
import { checkGoogleServicesFileAsync, checkNodeEnvVariable } from '../validate';
import { ensureIosCredentialsAsync } from './credentials';
@@ -17,9 +17,7 @@ import { prepareJobAsync } from './prepareJob';
import { syncProjectConfigurationAsync } from './syncProjectConfiguration';
import { resolveRemoteBuildNumberAsync } from './version';
export async function createIosContextAsync(
ctx: CommonContext<Platform.IOS>
): Promise<IosBuildContext> {
export async function createIosContextAsync(ctx: IosCommonContext): Promise<IosBuildContext> {
const { buildProfile } = ctx;
if (ctx.workflow === Workflow.MANAGED) {
@@ -63,12 +61,10 @@ export async function createIosContextAsync(
};
}
export async function prepareIosBuildAsync(
ctx: BuildContext<Platform.IOS>
): Promise<BuildRequestSender> {
export async function prepareIosBuildAsync(ctx: BuildContextIos): Promise<BuildRequestSender> {
return await prepareBuildRequestForPlatformAsync({
ctx,
ensureCredentialsAsync: async (ctx: BuildContext<Platform.IOS>) => {
ensureCredentialsAsync: async (ctx: BuildContextIos) => {
return ensureIosCredentialsAsync(ctx, ctx.ios.targets);
},
syncProjectConfigurationAsync: async () => {
@@ -83,7 +79,7 @@ export async function prepareIosBuildAsync(
});
},
prepareJobAsync: async (
ctx: BuildContext<Platform.IOS>,
ctx: BuildContextIos,
jobData: JobData<IosCredentials>
): Promise<Job> => {
return await prepareJobAsync(ctx, {
@@ -4,11 +4,11 @@ import IosCredentialsProvider from '../../credentials/ios/IosCredentialsProvider
import { getAppFromContext } from '../../credentials/ios/actions/BuildCredentialsUtils';
import { IosCredentials, Target } from '../../credentials/ios/types';
import { CredentialsResult } from '../build';
import { BuildContext } from '../context';
import { BuildContextIos } from '../context';
import { logCredentialsSource } from '../utils/credentials';
export async function ensureIosCredentialsAsync(
buildCtx: BuildContext<Platform.IOS>,
buildCtx: BuildContextIos,
targets: Target[]
): Promise<CredentialsResult<IosCredentials> | undefined> {
if (!shouldProvideCredentials(buildCtx)) {
@@ -31,6 +31,6 @@ export async function ensureIosCredentialsAsync(
};
}
function shouldProvideCredentials(buildCtx: BuildContext<Platform.IOS>): boolean {
function shouldProvideCredentials(buildCtx: BuildContextIos): boolean {
return !buildCtx.buildProfile.simulator;
}
+2 -5
View File
@@ -6,7 +6,7 @@ import { IosCredentials, TargetCredentials } from '../../credentials/ios/types';
import { getUsername } from '../../project/projectUtils';
import { ensureLoggedInAsync } from '../../user/actions';
import { getVcsClient } from '../../vcs';
import { BuildContext } from '../context';
import { BuildContextIos } from '../context';
interface JobData {
projectArchive: ArchiveSource;
@@ -20,10 +20,7 @@ const cacheDefaults = {
cacheDefaultPaths: true,
};
export async function prepareJobAsync(
ctx: BuildContext<Platform.IOS>,
jobData: JobData
): Promise<Job> {
export async function prepareJobAsync(ctx: BuildContextIos, jobData: JobData): Promise<Job> {
const projectRootDirectory =
slash(path.relative(await getVcsClient().getRootPathAsync(), ctx.projectDir)) || '.';
const username = getUsername(ctx.exp, await ensureLoggedInAsync());
+21 -35
View File
@@ -18,12 +18,10 @@ import { ensureLoggedInAsync } from '../user/actions';
import { easCliVersion } from '../utils/easCli';
import { getVcsClient } from '../vcs';
import { maybeResolveVersionsAsync as maybeResolveAndroidVersionsAsync } from './android/version';
import { BuildContext } from './context';
import { BuildContext, BuildContextIos } from './context';
import { maybeResolveVersionsAsync as maybeResolveIosVersionsAsync } from './ios/version';
export async function collectMetadataAsync<T extends Platform>(
ctx: BuildContext<T>
): Promise<Metadata> {
export async function collectMetadataAsync(ctx: BuildContext): Promise<Metadata> {
const vcsClient = getVcsClient();
const channelOrReleaseChannel = await resolveChannelOrReleaseChannelAsync(ctx);
const distribution =
@@ -52,9 +50,7 @@ export async function collectMetadataAsync<T extends Platform>(
username: getUsername(ctx.exp, await ensureLoggedInAsync()),
message: ctx.message,
...(ctx.platform === Platform.IOS && {
iosEnterpriseProvisioning: resolveIosEnterpriseProvisioning(
ctx as BuildContext<Platform.IOS>
),
iosEnterpriseProvisioning: resolveIosEnterpriseProvisioning(ctx),
}),
runWithNoWaitFlag: ctx.noWait,
runFromCI: ctx.runFromCI,
@@ -62,52 +58,48 @@ export async function collectMetadataAsync<T extends Platform>(
return sanitizeMetadata(metadata);
}
async function maybeResolveVersionsAsync<T extends Platform>(
ctx: BuildContext<T>
async function maybeResolveVersionsAsync(
ctx: BuildContext
): Promise<{ appBuildVersion?: string; appVersion?: string }> {
if (ctx.platform === Platform.IOS) {
const iosContext = ctx as BuildContext<Platform.IOS>;
const resolvedVersion = await maybeResolveIosVersionsAsync(
ctx.projectDir,
ctx.exp,
iosContext.ios.targets
ctx.ios.targets
);
if (iosContext.ios.buildNumberOverride) {
if (ctx.ios.buildNumberOverride) {
return {
...resolvedVersion,
appBuildVersion: iosContext.ios.buildNumberOverride,
appBuildVersion: ctx.ios.buildNumberOverride,
};
}
return resolvedVersion;
} else if (ctx.platform === Platform.ANDROID) {
const androidCtx = ctx as BuildContext<Platform.ANDROID>;
} else {
const resolvedVersion = await maybeResolveAndroidVersionsAsync(
ctx.projectDir,
ctx.exp,
androidCtx.buildProfile
ctx.buildProfile
);
if (androidCtx.android.versionCodeOverride) {
if (ctx.android.versionCodeOverride) {
return {
...resolvedVersion,
appBuildVersion: androidCtx.android.versionCodeOverride,
appBuildVersion: ctx.android.versionCodeOverride,
};
}
return resolvedVersion;
} else {
throw new Error(`Unsupported platform ${ctx.platform}`);
}
}
function resolveAppIdentifier<T extends Platform>(ctx: BuildContext<T>): string {
function resolveAppIdentifier(ctx: BuildContext): string {
if (ctx.platform === Platform.IOS) {
return (ctx as BuildContext<Platform.IOS>).ios.bundleIdentifier;
return ctx.ios.bundleIdentifier;
} else {
return (ctx as BuildContext<Platform.ANDROID>).android.applicationId;
return ctx.android.applicationId;
}
}
async function resolveChannelOrReleaseChannelAsync<T extends Platform>(
ctx: BuildContext<T>
async function resolveChannelOrReleaseChannelAsync(
ctx: BuildContext
): Promise<{ channel: string } | { releaseChannel: string } | null> {
if (!isExpoUpdatesInstalled(ctx.projectDir)) {
return null;
@@ -126,9 +118,7 @@ async function resolveChannelOrReleaseChannelAsync<T extends Platform>(
return { releaseChannel };
}
async function getNativeReleaseChannelAsync<T extends Platform>(
ctx: BuildContext<T>
): Promise<string> {
async function getNativeReleaseChannelAsync(ctx: BuildContext): Promise<string> {
switch (ctx.platform) {
case Platform.ANDROID: {
return (await readAndroidReleaseChannelSafelyAsync(ctx.projectDir)) ?? 'default';
@@ -141,9 +131,7 @@ async function getNativeReleaseChannelAsync<T extends Platform>(
}
}
async function getNativeChannelAsync<T extends Platform>(
ctx: BuildContext<T>
): Promise<string | undefined> {
async function getNativeChannelAsync(ctx: BuildContext): Promise<string | undefined> {
switch (ctx.platform) {
case Platform.ANDROID: {
return (await readAndroidChannelSafelyAsync(ctx.projectDir)) ?? undefined;
@@ -156,9 +144,7 @@ async function getNativeChannelAsync<T extends Platform>(
return undefined;
}
async function getReactNativeVersionAsync(
ctx: BuildContext<Platform>
): Promise<string | undefined> {
async function getReactNativeVersionAsync(ctx: BuildContext): Promise<string | undefined> {
try {
const reactNativePackageJsonPath = resolveFrom(ctx.projectDir, 'react-native/package.json');
return (await fs.readJson(reactNativePackageJsonPath)).version;
@@ -170,7 +156,7 @@ async function getReactNativeVersionAsync(
}
function resolveIosEnterpriseProvisioning(
ctx: BuildContext<Platform.IOS>
ctx: BuildContextIos
): IosEnterpriseProvisioning | undefined {
return ctx.buildProfile.enterpriseProvisioning;
}
@@ -119,7 +119,7 @@ export async function runBuildAndSubmitAsync(projectDir: string, flags: BuildFla
build: BuildWithSubmissionsFragment | BuildFragment;
buildProfile: ProfileData<'build'>;
}[] = [];
const buildCtxByPlatform: { [p in AppPlatform]?: BuildContext<Platform> } = {};
const buildCtxByPlatform: { [p in AppPlatform]?: BuildContext } = {};
for (const buildProfile of buildProfiles) {
const { build: maybeBuild, buildCtx } = await prepareAndStartBuildAsync({
@@ -232,7 +232,7 @@ async function prepareAndStartBuildAsync({
buildProfile: ProfileData<'build'>;
resourceClass: BuildResourceClass;
easJsonCliConfig: EasJson['cli'];
}): Promise<{ build: BuildFragment | undefined; buildCtx: BuildContext<Platform> }> {
}): Promise<{ build: BuildFragment | undefined; buildCtx: BuildContext }> {
const buildCtx = await createBuildContextAsync({
buildProfileName: buildProfile.profileName,
resourceClass,
@@ -278,12 +278,12 @@ async function prepareAndStartBuildAsync({
};
}
async function startBuildAsync(ctx: BuildContext<Platform>): Promise<BuildFragment | undefined> {
async function startBuildAsync(ctx: BuildContext): Promise<BuildFragment | undefined> {
let sendBuildRequestAsync: BuildRequestSender;
if (ctx.platform === Platform.ANDROID) {
sendBuildRequestAsync = await prepareAndroidBuildAsync(ctx as BuildContext<Platform.ANDROID>);
sendBuildRequestAsync = await prepareAndroidBuildAsync(ctx);
} else {
sendBuildRequestAsync = await prepareIosBuildAsync(ctx as BuildContext<Platform.IOS>);
sendBuildRequestAsync = await prepareIosBuildAsync(ctx);
}
return await sendBuildRequestAsync();
}
@@ -298,7 +298,7 @@ async function prepareAndStartSubmissionAsync({
nonInteractive,
}: {
build: BuildFragment;
buildCtx: BuildContext<Platform>;
buildCtx: BuildContext;
moreBuilds: boolean;
projectDir: string;
buildProfile: BuildProfile;
@@ -315,7 +315,10 @@ async function prepareAndStartSubmissionAsync({
nonInteractive,
env: buildProfile.env,
credentialsCtx: buildCtx.credentialsCtx,
applicationIdentifier: buildCtx.android?.applicationId ?? buildCtx.ios?.bundleIdentifier,
applicationIdentifier:
buildCtx.platform === Platform.ANDROID
? buildCtx.android.applicationId
: buildCtx.ios.bundleIdentifier,
});
if (moreBuilds) {
+3 -5
View File
@@ -1,4 +1,4 @@
import { Platform, Workflow } from '@expo/eas-build-job';
import { Workflow } from '@expo/eas-build-job';
import fs from 'fs-extra';
import path from 'path';
@@ -6,7 +6,7 @@ import Log, { learnMore } from '../log';
import { getVcsClient } from '../vcs';
import { CommonContext } from './context';
export function checkNodeEnvVariable(ctx: CommonContext<Platform>): void {
export function checkNodeEnvVariable(ctx: CommonContext): void {
if (ctx.buildProfile.env?.NODE_ENV === 'production') {
Log.warn(
'You set NODE_ENV=production in the build profile. Remember that it will be available during the entire build process. In particular, it will make yarn/npm install only production packages.'
@@ -15,9 +15,7 @@ export function checkNodeEnvVariable(ctx: CommonContext<Platform>): void {
}
}
export async function checkGoogleServicesFileAsync<T extends Platform>(
ctx: CommonContext<T>
): Promise<void> {
export async function checkGoogleServicesFileAsync(ctx: CommonContext): Promise<void> {
if (ctx.workflow === Workflow.GENERIC || ctx.buildProfile?.env?.GOOGLE_SERVICES_FILE) {
return;
}
+2 -2
View File
@@ -1,4 +1,4 @@
import { Platform, Workflow } from '@expo/eas-build-job';
import { Workflow } from '@expo/eas-build-job';
import { Errors } from '@oclif/core';
import assert from 'assert';
import semver from 'semver';
@@ -10,7 +10,7 @@ import { confirmAsync } from '../prompts';
const SUPPORTED_EXPO_SDK_VERSIONS = '>= 41.0.0';
assert(semver.validRange(SUPPORTED_EXPO_SDK_VERSIONS), 'Must be a valid version range');
export async function checkExpoSdkIsSupportedAsync(ctx: BuildContext<Platform>): Promise<void> {
export async function checkExpoSdkIsSupportedAsync(ctx: BuildContext): Promise<void> {
assert(ctx.workflow === Workflow.MANAGED, 'Must be a managed workflow project');
if (ctx.exp.sdkVersion && semver.satisfies(ctx.exp.sdkVersion, SUPPORTED_EXPO_SDK_VERSIONS)) {
+1 -4
View File
@@ -1,4 +1,3 @@
import { Platform } from '@expo/eas-build-job';
import { Errors } from '@oclif/core';
import chalk from 'chalk';
import type MetroConfig from 'metro-config';
@@ -8,9 +7,7 @@ import { BuildContext } from '../build/context';
import Log, { learnMore } from '../log';
import { confirmAsync } from '../prompts';
export async function validateMetroConfigForManagedWorkflowAsync(
ctx: BuildContext<Platform>
): Promise<void> {
export async function validateMetroConfigForManagedWorkflowAsync(ctx: BuildContext): Promise<void> {
if (!(await configExistsAsync(ctx.projectDir))) {
return;
}