mirror of
https://github.com/expo/eas-cli.git
synced 2026-11-14 10:08:06 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9b711eae77 | ||
|
|
2bca449793 |
No files matched your search
@@ -7,6 +7,7 @@ import { AndroidCredentials } from '../../credentials/android/AndroidCredentials
|
||||
import { getUsername } from '../../project/projectUtils';
|
||||
import { getVcsClient } from '../../vcs';
|
||||
import { BuildContext } from '../context';
|
||||
import { resolveChannel } from '../utils/updates';
|
||||
|
||||
interface JobData {
|
||||
projectArchive: ArchiveSource;
|
||||
@@ -68,7 +69,7 @@ export async function prepareJobAsync(
|
||||
...buildCredentials,
|
||||
},
|
||||
releaseChannel: ctx.buildProfile.releaseChannel,
|
||||
updates: { channel: ctx.buildProfile.channel },
|
||||
updates: { channel: resolveChannel(ctx) },
|
||||
developmentClient: buildProfile.developmentClient,
|
||||
gradleCommand: buildProfile.gradleCommand,
|
||||
applicationArchivePath: buildProfile.applicationArchivePath ?? buildProfile.artifactPath,
|
||||
|
||||
@@ -6,6 +6,7 @@ import { IosCredentials, TargetCredentials } from '../../credentials/ios/types';
|
||||
import { getUsername } from '../../project/projectUtils';
|
||||
import { getVcsClient } from '../../vcs';
|
||||
import { BuildContext } from '../context';
|
||||
import { resolveChannel } from '../utils/updates';
|
||||
|
||||
interface JobData {
|
||||
projectArchive: ArchiveSource;
|
||||
@@ -58,7 +59,7 @@ export async function prepareJobAsync(
|
||||
buildCredentials,
|
||||
},
|
||||
releaseChannel: ctx.buildProfile.releaseChannel,
|
||||
updates: { channel: ctx.buildProfile.channel },
|
||||
updates: { channel: resolveChannel(ctx) },
|
||||
developmentClient: ctx.buildProfile.developmentClient,
|
||||
simulator: ctx.buildProfile.simulator,
|
||||
scheme: jobData.buildScheme,
|
||||
|
||||
@@ -5,7 +5,11 @@ import fs from 'fs-extra';
|
||||
import resolveFrom from 'resolve-from';
|
||||
|
||||
import Log from '../log';
|
||||
import { getUsername, isExpoUpdatesInstalled } from '../project/projectUtils';
|
||||
import {
|
||||
getUsername,
|
||||
isEASUpdateConfigured,
|
||||
isExpoUpdatesInstalled,
|
||||
} from '../project/projectUtils';
|
||||
import {
|
||||
readChannelSafelyAsync as readAndroidChannelSafelyAsync,
|
||||
readReleaseChannelSafelyAsync as readAndroidReleaseChannelSafelyAsync,
|
||||
@@ -19,6 +23,7 @@ import { getVcsClient } from '../vcs';
|
||||
import { maybeResolveVersionsAsync as maybeResolveAndroidVersionsAsync } from './android/version';
|
||||
import { BuildContext } from './context';
|
||||
import { maybeResolveVersionsAsync as maybeResolveIosVersionsAsync } from './ios/version';
|
||||
import { resolveChannel } from './utils/updates';
|
||||
|
||||
export async function collectMetadataAsync<T extends Platform>(
|
||||
ctx: BuildContext<T>
|
||||
@@ -111,16 +116,17 @@ async function resolveChannelOrReleaseChannelAsync<T extends Platform>(
|
||||
if (!isExpoUpdatesInstalled(ctx.projectDir)) {
|
||||
return null;
|
||||
}
|
||||
if (ctx.buildProfile.channel) {
|
||||
return { channel: ctx.buildProfile.channel };
|
||||
const maybeChannel = resolveChannel(ctx);
|
||||
if (maybeChannel) {
|
||||
return { channel: maybeChannel };
|
||||
}
|
||||
const nativeChannel = await getNativeChannelAsync(ctx);
|
||||
if (isEASUpdateConfigured(ctx.projectDir, ctx.exp) && nativeChannel) {
|
||||
return { channel: nativeChannel };
|
||||
}
|
||||
if (ctx.buildProfile.releaseChannel) {
|
||||
return { releaseChannel: ctx.buildProfile.releaseChannel };
|
||||
}
|
||||
const channel = await getNativeChannelAsync(ctx);
|
||||
if (channel) {
|
||||
return { channel };
|
||||
}
|
||||
const releaseChannel = await getNativeReleaseChannelAsync(ctx);
|
||||
return { releaseChannel };
|
||||
}
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
import { Platform } from '@expo/eas-build-job';
|
||||
import { BuildProfile } from '@expo/eas-json';
|
||||
import { instance, mock, when } from 'ts-mockito';
|
||||
|
||||
import { isEASUpdateConfigured } from '../../../project/projectUtils';
|
||||
import { BuildContext } from '../../context';
|
||||
import { resolveChannel } from '../updates';
|
||||
|
||||
jest.mock('../../../project/projectUtils', () => ({
|
||||
isEASUpdateConfigured: jest.fn(),
|
||||
}));
|
||||
|
||||
describe(resolveChannel, () => {
|
||||
it('returns "channel" from build profile if specified', () => {
|
||||
jest.mocked(isEASUpdateConfigured).mockReturnValue(true);
|
||||
|
||||
const buildProfileMock = mock<BuildProfile<Platform>>();
|
||||
when(buildProfileMock.channel).thenReturn('blahblah');
|
||||
const buildProfile = instance(buildProfileMock);
|
||||
|
||||
const ctxMock = mock<BuildContext<Platform>>();
|
||||
when(ctxMock.exp).thenReturn({
|
||||
name: 'todo',
|
||||
slug: 'todo',
|
||||
updates: { url: 'http://sokal.dev/todo' },
|
||||
});
|
||||
when(ctxMock.buildProfileName).thenReturn('production');
|
||||
when(ctxMock.buildProfile).thenReturn(buildProfile);
|
||||
const ctx = instance(ctxMock);
|
||||
|
||||
expect(resolveChannel(ctx)).toBe('blahblah');
|
||||
});
|
||||
|
||||
it('returns undefined if "channel" is not specified in build profile and EAS Update is not configured', () => {
|
||||
jest.mocked(isEASUpdateConfigured).mockReturnValue(false);
|
||||
|
||||
const buildProfileMock = mock<BuildProfile<Platform>>();
|
||||
when(buildProfileMock.channel).thenReturn(undefined);
|
||||
const buildProfile = instance(buildProfileMock);
|
||||
|
||||
const ctxMock = mock<BuildContext<Platform>>();
|
||||
when(ctxMock.exp).thenReturn({
|
||||
name: 'todo',
|
||||
slug: 'todo',
|
||||
});
|
||||
when(ctxMock.buildProfileName).thenReturn('production');
|
||||
when(ctxMock.buildProfile).thenReturn(buildProfile);
|
||||
const ctx = instance(ctxMock);
|
||||
|
||||
expect(resolveChannel(ctx)).toBe(undefined);
|
||||
});
|
||||
|
||||
it('returns the build profile name if "channel" is not specified in build profile and EAS Update is configured', () => {
|
||||
jest.mocked(isEASUpdateConfigured).mockReturnValue(true);
|
||||
|
||||
const buildProfileMock = mock<BuildProfile<Platform>>();
|
||||
when(buildProfileMock.channel).thenReturn(undefined);
|
||||
const buildProfile = instance(buildProfileMock);
|
||||
|
||||
const ctxMock = mock<BuildContext<Platform>>();
|
||||
when(ctxMock.exp).thenReturn({
|
||||
name: 'todo',
|
||||
slug: 'todo',
|
||||
updates: { url: 'http://sokal.dev/todo' },
|
||||
});
|
||||
when(ctxMock.buildProfileName).thenReturn('production');
|
||||
when(ctxMock.buildProfile).thenReturn(buildProfile);
|
||||
const ctx = instance(ctxMock);
|
||||
|
||||
expect(resolveChannel(ctx)).toBe('production');
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,12 @@
|
||||
import { Platform } from '@expo/eas-build-job';
|
||||
|
||||
import { isEASUpdateConfigured } from '../../project/projectUtils';
|
||||
import { BuildContext } from '../context';
|
||||
|
||||
export function resolveChannel(ctx: BuildContext<Platform>): string | undefined {
|
||||
let fallback: string | undefined = undefined;
|
||||
if (isEASUpdateConfigured(ctx.projectDir, ctx.exp)) {
|
||||
fallback = ctx.buildProfileName;
|
||||
}
|
||||
return ctx.buildProfile.channel ?? fallback;
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
import { getPackageJson } from '@expo/config';
|
||||
import { ExpoConfig } from '@expo/config-types';
|
||||
|
||||
import * as projectUtils from '../projectUtils';
|
||||
|
||||
jest.mock('@expo/config', () => ({
|
||||
getPackageJson: jest.fn(),
|
||||
}));
|
||||
|
||||
describe(projectUtils.isEASUpdateConfigured, () => {
|
||||
describe('expo-updates is not installed', () => {
|
||||
it('returns false if updates.url is not set', () => {
|
||||
jest.mocked(getPackageJson).mockReturnValue({});
|
||||
|
||||
const exp: ExpoConfig = {
|
||||
name: 'blah',
|
||||
slug: 'blah',
|
||||
};
|
||||
expect(projectUtils.isEASUpdateConfigured('/path/to/project', exp)).toBe(false);
|
||||
});
|
||||
|
||||
it('returns false if updates.url is set', () => {
|
||||
jest.mocked(getPackageJson).mockReturnValue({});
|
||||
|
||||
const exp: ExpoConfig = {
|
||||
name: 'blah',
|
||||
slug: 'blah',
|
||||
updates: { url: 'http://sokal.dev/todo' },
|
||||
};
|
||||
expect(projectUtils.isEASUpdateConfigured('/path/to/project', exp)).toBe(false);
|
||||
});
|
||||
|
||||
it('returns true if updates.url is set (for SDK < 44)', () => {
|
||||
jest.mocked(getPackageJson).mockReturnValue({});
|
||||
|
||||
const exp: ExpoConfig = {
|
||||
name: 'blah',
|
||||
slug: 'blah',
|
||||
sdkVersion: '43.0.0',
|
||||
updates: { url: 'http://sokal.dev/todo' },
|
||||
};
|
||||
expect(projectUtils.isEASUpdateConfigured('/path/to/project', exp)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('expo-updates is installed', () => {
|
||||
it('returns false if updates.url is not set', () => {
|
||||
jest.mocked(getPackageJson).mockReturnValue({
|
||||
dependencies: {
|
||||
'expo-updates': '1.2.3',
|
||||
},
|
||||
});
|
||||
|
||||
const exp: ExpoConfig = {
|
||||
name: 'blah',
|
||||
slug: 'blah',
|
||||
};
|
||||
expect(projectUtils.isEASUpdateConfigured('/path/to/project', exp)).toBe(false);
|
||||
});
|
||||
|
||||
it('returns true if updates.url is set', () => {
|
||||
jest.mocked(getPackageJson).mockReturnValue({
|
||||
dependencies: {
|
||||
'expo-updates': '1.2.3',
|
||||
},
|
||||
});
|
||||
|
||||
const exp: ExpoConfig = {
|
||||
name: 'blah',
|
||||
slug: 'blah',
|
||||
updates: { url: 'http://sokal.dev/todo' },
|
||||
};
|
||||
expect(projectUtils.isEASUpdateConfigured('/path/to/project', exp)).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
File renamed without changes.
@@ -64,18 +64,19 @@ export function isExpoUpdatesInstalled(projectDir: string): boolean {
|
||||
return !!(packageJson.dependencies && 'expo-updates' in packageJson.dependencies);
|
||||
}
|
||||
|
||||
export function isExpoUpdatesInstalledOrAvailable(
|
||||
projectDir: string,
|
||||
sdkVersion?: string
|
||||
): boolean {
|
||||
export function isExpoUpdatesInstalledOrAvailable(projectDir: string, exp: ExpoConfig): boolean {
|
||||
// before sdk 44, expo-updates was included in with the expo module
|
||||
if (sdkVersion && semver.lt(sdkVersion, '44.0.0')) {
|
||||
if (exp.sdkVersion && semver.lt(exp.sdkVersion, '44.0.0')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return isExpoUpdatesInstalled(projectDir);
|
||||
}
|
||||
|
||||
export function isEASUpdateConfigured(projectDir: string, exp: ExpoConfig): boolean {
|
||||
return isExpoUpdatesInstalledOrAvailable(projectDir, exp) && exp.updates?.url !== undefined;
|
||||
}
|
||||
|
||||
export async function validateAppVersionRuntimePolicySupportAsync(
|
||||
projectDir: string,
|
||||
exp: ExpoConfig
|
||||
|
||||
@@ -17,7 +17,7 @@ import {
|
||||
SubmissionAndroidTrack,
|
||||
} from '../../../graphql/generated';
|
||||
import { SubmissionMutation } from '../../../graphql/mutations/SubmissionMutation';
|
||||
import { createTestProject } from '../../../project/__tests__/project-utils';
|
||||
import { createTestProject } from '../../../project/__tests__/utils';
|
||||
import { getOwnerAccountForProjectIdAsync } from '../../../project/projectUtils';
|
||||
import { createSubmissionContextAsync } from '../../context';
|
||||
import { getRecentBuildsForSubmissionAsync } from '../../utils/builds';
|
||||
|
||||
@@ -12,7 +12,7 @@ import {
|
||||
testProjectId,
|
||||
} from '../../../credentials/__tests__/fixtures-constants';
|
||||
import { SetUpGoogleServiceAccountKey } from '../../../credentials/android/actions/SetUpGoogleServiceAccountKey';
|
||||
import { createTestProject } from '../../../project/__tests__/project-utils';
|
||||
import { createTestProject } from '../../../project/__tests__/utils';
|
||||
import { getOwnerAccountForProjectIdAsync } from '../../../project/projectUtils';
|
||||
import { promptAsync } from '../../../prompts';
|
||||
import { createSubmissionContextAsync } from '../../context';
|
||||
|
||||
@@ -12,7 +12,7 @@ import {
|
||||
} from '../../../credentials/__tests__/fixtures-constants';
|
||||
import { getCredentialsFromUserAsync } from '../../../credentials/utils/promptForCredentials';
|
||||
import { AppQuery } from '../../../graphql/queries/AppQuery';
|
||||
import { createTestProject } from '../../../project/__tests__/project-utils';
|
||||
import { createTestProject } from '../../../project/__tests__/utils';
|
||||
import { promptAsync } from '../../../prompts';
|
||||
import { SubmissionContext, createSubmissionContextAsync } from '../../context';
|
||||
import {
|
||||
|
||||
@@ -12,7 +12,7 @@ import {
|
||||
import { testCommonIosAppCredentialsFragment } from '../../../credentials/__tests__/fixtures-ios';
|
||||
import { SetUpSubmissionCredentials } from '../../../credentials/ios/actions/SetUpSubmissionCredentials';
|
||||
import { AppQuery } from '../../../graphql/queries/AppQuery';
|
||||
import { createTestProject } from '../../../project/__tests__/project-utils';
|
||||
import { createTestProject } from '../../../project/__tests__/utils';
|
||||
import { getBundleIdentifierAsync } from '../../../project/ios/bundleIdentifier';
|
||||
import { promptAsync } from '../../../prompts';
|
||||
import { createSubmissionContextAsync } from '../../context';
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
testProjectId,
|
||||
} from '../../../credentials/__tests__/fixtures-constants';
|
||||
import { SubmissionMutation } from '../../../graphql/mutations/SubmissionMutation';
|
||||
import { createTestProject } from '../../../project/__tests__/project-utils';
|
||||
import { createTestProject } from '../../../project/__tests__/utils';
|
||||
import { getOwnerAccountForProjectIdAsync } from '../../../project/projectUtils';
|
||||
import { createSubmissionContextAsync } from '../../context';
|
||||
import IosSubmitCommand from '../IosSubmitCommand';
|
||||
|
||||
@@ -275,10 +275,7 @@ export async function ensureEASUpdatesIsConfiguredAsync(
|
||||
platform: RequestedPlatform;
|
||||
}
|
||||
): Promise<void> {
|
||||
const hasExpoUpdates = isExpoUpdatesInstalledOrAvailable(
|
||||
projectDir,
|
||||
expWithoutUpdates.sdkVersion
|
||||
);
|
||||
const hasExpoUpdates = isExpoUpdatesInstalledOrAvailable(projectDir, expWithoutUpdates);
|
||||
if (!hasExpoUpdates) {
|
||||
await installExpoUpdatesAsync(projectDir, { silent: !Log.isDebug });
|
||||
Log.withTick('Installed expo updates');
|
||||
|
||||
Reference in new issue
Block a user