diff --git a/packages/eas-cli/package.json b/packages/eas-cli/package.json index 516e142a57..59f22e3a44 100644 --- a/packages/eas-cli/package.json +++ b/packages/eas-cli/package.json @@ -10,9 +10,9 @@ "dependencies": { "@expo/apple-utils": "1.3.2", "@expo/code-signing-certificates": "0.0.5", - "@expo/config": "8.1.2", - "@expo/config-plugins": "7.2.4", - "@expo/config-types": "49.0.0", + "@expo/config": "8.5.2", + "@expo/config-plugins": "7.8.2", + "@expo/config-types": "50.0.0", "@expo/eas-build-job": "1.0.50", "@expo/eas-json": "5.9.3", "@expo/json-file": "8.2.37", @@ -23,7 +23,7 @@ "@expo/plist": "0.0.20", "@expo/plugin-help": "5.1.23", "@expo/plugin-warn-if-update-available": "2.5.1", - "@expo/prebuild-config": "6.2.5", + "@expo/prebuild-config": "6.7.2", "@expo/results": "1.0.0", "@expo/rudder-sdk-node": "1.1.1", "@expo/spawn-async": "1.7.0", diff --git a/packages/eas-cli/src/build/android/build.ts b/packages/eas-cli/src/build/android/build.ts index 16c2559f48..a4199a00f9 100644 --- a/packages/eas-cli/src/build/android/build.ts +++ b/packages/eas-cli/src/build/android/build.ts @@ -99,14 +99,13 @@ export async function prepareAndroidBuildAsync( return await ensureAndroidCredentialsAsync(ctx); }, syncProjectConfigurationAsync: async () => { - await syncProjectConfigurationAsync(ctx.graphqlClient, { + await syncProjectConfigurationAsync({ projectDir: ctx.projectDir, exp: ctx.exp, localAutoIncrement: ctx.easJsonCliConfig?.appVersionSource === AppVersionSource.REMOTE ? false : ctx.buildProfile.autoIncrement, - projectId: ctx.projectId, vcsClient: ctx.vcsClient, }); }, diff --git a/packages/eas-cli/src/build/android/syncProjectConfiguration.ts b/packages/eas-cli/src/build/android/syncProjectConfiguration.ts index d1a774ccd8..bb65489042 100644 --- a/packages/eas-cli/src/build/android/syncProjectConfiguration.ts +++ b/packages/eas-cli/src/build/android/syncProjectConfiguration.ts @@ -6,7 +6,6 @@ import chalk from 'chalk'; import fs from 'fs-extra'; import path from 'path'; -import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient'; import Log from '../../log'; import { isExpoUpdatesInstalled } from '../../project/projectUtils'; import { resolveWorkflowAsync } from '../../project/workflow'; @@ -14,29 +13,24 @@ import { syncUpdatesConfigurationAsync } from '../../update/android/UpdatesModul import { Client } from '../../vcs/vcs'; import { BumpStrategy, bumpVersionAsync, bumpVersionInAppJsonAsync } from './version'; -export async function syncProjectConfigurationAsync( - graphqlClient: ExpoGraphqlClient, - { - projectDir, - exp, - localAutoIncrement, - projectId, - vcsClient, - }: { - projectDir: string; - exp: ExpoConfig; - localAutoIncrement?: AndroidVersionAutoIncrement; - projectId: string; - vcsClient: Client; - } -): Promise { +export async function syncProjectConfigurationAsync({ + projectDir, + exp, + localAutoIncrement, + vcsClient, +}: { + projectDir: string; + exp: ExpoConfig; + localAutoIncrement?: AndroidVersionAutoIncrement; + vcsClient: Client; +}): Promise { const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient); const versionBumpStrategy = resolveVersionBumpStrategy(localAutoIncrement ?? false); if (workflow === Workflow.GENERIC) { await cleanUpOldEasBuildGradleScriptAsync(projectDir); if (isExpoUpdatesInstalled(projectDir)) { - await syncUpdatesConfigurationAsync(graphqlClient, projectDir, exp, projectId); + await syncUpdatesConfigurationAsync(projectDir, exp); } await bumpVersionAsync({ projectDir, exp, bumpStrategy: versionBumpStrategy }); } else { diff --git a/packages/eas-cli/src/build/android/version.ts b/packages/eas-cli/src/build/android/version.ts index 165d460bba..fdcfe048ac 100644 --- a/packages/eas-cli/src/build/android/version.ts +++ b/packages/eas-cli/src/build/android/version.ts @@ -232,7 +232,9 @@ export async function resolveRemoteVersionCodeAsync( applicationIdentifier: applicationId, storeVersion: localVersions.appVersion ?? exp.version ?? '1.0.0', buildVersion: currentBuildVersion, - runtimeVersion: Updates.getRuntimeVersionNullable(exp, Platform.ANDROID) ?? undefined, + runtimeVersion: + (await Updates.getRuntimeVersionNullableAsync(projectDir, exp, Platform.ANDROID)) ?? + undefined, }); spinner.succeed(`Initialized versionCode with ${chalk.bold(currentBuildVersion)}.`); } catch (err) { @@ -254,7 +256,9 @@ export async function resolveRemoteVersionCodeAsync( applicationIdentifier: applicationId, storeVersion: localVersions.appVersion ?? exp.version ?? '1.0.0', buildVersion: String(nextBuildVersion), - runtimeVersion: Updates.getRuntimeVersionNullable(exp, Platform.ANDROID) ?? undefined, + runtimeVersion: + (await Updates.getRuntimeVersionNullableAsync(projectDir, exp, Platform.ANDROID)) ?? + undefined, }); spinner.succeed( `Incremented versionCode from ${chalk.bold(currentBuildVersion)} to ${chalk.bold( diff --git a/packages/eas-cli/src/build/ios/build.ts b/packages/eas-cli/src/build/ios/build.ts index 031a5e1318..6693bcd05d 100644 --- a/packages/eas-cli/src/build/ios/build.ts +++ b/packages/eas-cli/src/build/ios/build.ts @@ -80,7 +80,7 @@ export async function prepareIosBuildAsync( return ensureIosCredentialsAsync(ctx, ctx.ios.targets); }, syncProjectConfigurationAsync: async () => { - await syncProjectConfigurationAsync(ctx.graphqlClient, { + await syncProjectConfigurationAsync({ projectDir: ctx.projectDir, exp: ctx.exp, targets: ctx.ios.targets, @@ -88,7 +88,6 @@ export async function prepareIosBuildAsync( ctx.easJsonCliConfig?.appVersionSource === AppVersionSource.REMOTE ? false : ctx.buildProfile.autoIncrement, - projectId: ctx.projectId, vcsClient: ctx.vcsClient, }); }, diff --git a/packages/eas-cli/src/build/ios/syncProjectConfiguration.ts b/packages/eas-cli/src/build/ios/syncProjectConfiguration.ts index ca810537c1..3ed2463f4e 100644 --- a/packages/eas-cli/src/build/ios/syncProjectConfiguration.ts +++ b/packages/eas-cli/src/build/ios/syncProjectConfiguration.ts @@ -2,7 +2,6 @@ import { ExpoConfig } from '@expo/config'; import { Platform, Workflow } from '@expo/eas-build-job'; import { IosVersionAutoIncrement } from '@expo/eas-json'; -import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient'; import { Target } from '../../credentials/ios/types'; import { isExpoUpdatesInstalled } from '../../project/projectUtils'; import { resolveWorkflowAsync } from '../../project/workflow'; @@ -10,30 +9,25 @@ import { syncUpdatesConfigurationAsync } from '../../update/ios/UpdatesModule'; import { Client } from '../../vcs/vcs'; import { BumpStrategy, bumpVersionAsync, bumpVersionInAppJsonAsync } from './version'; -export async function syncProjectConfigurationAsync( - graphqlClient: ExpoGraphqlClient, - { - projectDir, - exp, - targets, - localAutoIncrement, - projectId, - vcsClient, - }: { - projectDir: string; - exp: ExpoConfig; - targets: Target[]; - localAutoIncrement?: IosVersionAutoIncrement; - projectId: string; - vcsClient: Client; - } -): Promise { +export async function syncProjectConfigurationAsync({ + projectDir, + exp, + targets, + localAutoIncrement, + vcsClient, +}: { + projectDir: string; + exp: ExpoConfig; + targets: Target[]; + localAutoIncrement?: IosVersionAutoIncrement; + vcsClient: Client; +}): Promise { const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient); const versionBumpStrategy = resolveVersionBumpStrategy(localAutoIncrement ?? false); if (workflow === Workflow.GENERIC) { if (isExpoUpdatesInstalled(projectDir)) { - await syncUpdatesConfigurationAsync(graphqlClient, vcsClient, projectDir, exp, projectId); + await syncUpdatesConfigurationAsync(vcsClient, projectDir, exp); } await bumpVersionAsync({ projectDir, exp, bumpStrategy: versionBumpStrategy, targets }); } else { diff --git a/packages/eas-cli/src/build/ios/version.ts b/packages/eas-cli/src/build/ios/version.ts index dddd846532..589aed06a8 100644 --- a/packages/eas-cli/src/build/ios/version.ts +++ b/packages/eas-cli/src/build/ios/version.ts @@ -342,7 +342,9 @@ export async function resolveRemoteBuildNumberAsync( applicationIdentifier: applicationTarget.bundleIdentifier, storeVersion: localShortVersion ?? '1.0.0', buildVersion: currentBuildVersion, - runtimeVersion: Updates.getRuntimeVersionNullable(exp, Platform.IOS) ?? undefined, + runtimeVersion: + (await Updates.getRuntimeVersionNullableAsync(projectDir, exp, Platform.IOS)) ?? + undefined, }); spinner.succeed(`Initialized buildNumber with ${chalk.bold(currentBuildVersion)}.`); } catch (err) { @@ -364,7 +366,9 @@ export async function resolveRemoteBuildNumberAsync( applicationIdentifier: applicationTarget.bundleIdentifier, storeVersion: localShortVersion ?? '1.0.0', buildVersion: nextBuildVersion, - runtimeVersion: Updates.getRuntimeVersionNullable(exp, Platform.IOS) ?? undefined, + runtimeVersion: + (await Updates.getRuntimeVersionNullableAsync(projectDir, exp, Platform.IOS)) ?? + undefined, }); spinner.succeed( `Incremented buildNumber from ${chalk.bold(currentBuildVersion)} to ${chalk.bold( diff --git a/packages/eas-cli/src/build/metadata.ts b/packages/eas-cli/src/build/metadata.ts index 5e9ab98c8a..813078b214 100644 --- a/packages/eas-cli/src/build/metadata.ts +++ b/packages/eas-cli/src/build/metadata.ts @@ -35,7 +35,9 @@ export async function collectMetadataAsync( workflow: ctx.workflow, credentialsSource: ctx.buildProfile.credentialsSource, sdkVersion: ctx.exp.sdkVersion, - runtimeVersion: Updates.getRuntimeVersionNullable(ctx.exp, ctx.platform) ?? undefined, + runtimeVersion: + (await Updates.getRuntimeVersionNullableAsync(ctx.projectDir, ctx.exp, ctx.platform)) ?? + undefined, reactNativeVersion: await getReactNativeVersionAsync(ctx.projectDir), ...channelOrReleaseChannel, distribution, diff --git a/packages/eas-cli/src/build/runBuildAndSubmit.ts b/packages/eas-cli/src/build/runBuildAndSubmit.ts index 15b6e61375..9602e4438a 100644 --- a/packages/eas-cli/src/build/runBuildAndSubmit.ts +++ b/packages/eas-cli/src/build/runBuildAndSubmit.ts @@ -334,7 +334,6 @@ async function prepareAndStartBuildAsync({ ); if (buildProfile.profile.channel) { await validateExpoUpdatesInstalledAsProjectDependencyAsync({ - graphqlClient, exp: buildCtx.exp, projectId: buildCtx.projectId, projectDir, @@ -479,7 +478,6 @@ async function maybeDownloadAndRunSimulatorBuildsAsync( async function validateExpoUpdatesInstalledAsProjectDependencyAsync({ exp, - graphqlClient, projectId, projectDir, vcsClient, @@ -487,7 +485,6 @@ async function validateExpoUpdatesInstalledAsProjectDependencyAsync({ nonInteractive, sdkVersion, }: { - graphqlClient: ExpoGraphqlClient; exp: ExpoConfig; projectId: string; projectDir: string; @@ -516,7 +513,7 @@ async function validateExpoUpdatesInstalledAsProjectDependencyAsync({ message: `Would you like to install the "expo-updates" package and configure EAS Update now?`, }); if (installExpoUpdates) { - await ensureEASUpdateIsConfiguredAsync(graphqlClient, { + await ensureEASUpdateIsConfiguredAsync({ exp, projectId, projectDir, diff --git a/packages/eas-cli/src/commands/build/configure.ts b/packages/eas-cli/src/commands/build/configure.ts index 2bde23eef0..420ea11b37 100644 --- a/packages/eas-cli/src/commands/build/configure.ts +++ b/packages/eas-cli/src/commands/build/configure.ts @@ -11,10 +11,7 @@ import { isExpoUpdatesInstalled, isUsingEASUpdate } from '../../project/projectU import { resolveWorkflowAsync } from '../../project/workflow'; import { promptAsync } from '../../prompts'; import { syncUpdatesConfigurationAsync as syncAndroidUpdatesConfigurationAsync } from '../../update/android/UpdatesModule'; -import { - ensureEASUpdateIsConfiguredInEasJsonAsync, - ensureUseClassicUpdatesIsRemovedAsync, -} from '../../update/configure'; +import { ensureEASUpdateIsConfiguredInEasJsonAsync } from '../../update/configure'; import { syncUpdatesConfigurationAsync as syncIosUpdatesConfigurationAsync } from '../../update/ios/UpdatesModule'; export default class BuildConfigure extends EasCommand { @@ -38,7 +35,6 @@ export default class BuildConfigure extends EasCommand { const { flags } = await this.parse(BuildConfigure); const { privateProjectConfig: { exp, projectId, projectDir }, - loggedIn: { graphqlClient }, vcsClient, } = await this.getContextAsync(BuildConfigure, { nonInteractive: false, @@ -70,12 +66,6 @@ export default class BuildConfigure extends EasCommand { vcsClient, }); if (didCreateEasJson && isUsingEASUpdate(exp, projectId)) { - if (exp.updates?.useClassicUpdates) { - // NOTE: this method modifies the Expo config; be sure to use this function's return value - // if the config object is used later in the future - await ensureUseClassicUpdatesIsRemovedAsync({ exp, projectDir }); - } - await ensureEASUpdateIsConfiguredInEasJsonAsync(projectDir); } @@ -84,20 +74,14 @@ export default class BuildConfigure extends EasCommand { if ([RequestedPlatform.Android, RequestedPlatform.All].includes(platform)) { const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient); if (workflow === Workflow.GENERIC) { - await syncAndroidUpdatesConfigurationAsync(graphqlClient, projectDir, exp, projectId); + await syncAndroidUpdatesConfigurationAsync(projectDir, exp); } } if ([RequestedPlatform.Ios, RequestedPlatform.All].includes(platform)) { const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient); if (workflow === Workflow.GENERIC) { - await syncIosUpdatesConfigurationAsync( - graphqlClient, - vcsClient, - projectDir, - exp, - projectId - ); + await syncIosUpdatesConfigurationAsync(vcsClient, projectDir, exp); } } } diff --git a/packages/eas-cli/src/commands/build/version/set.ts b/packages/eas-cli/src/commands/build/version/set.ts index f7bf613044..965699f468 100644 --- a/packages/eas-cli/src/commands/build/version/set.ts +++ b/packages/eas-cli/src/commands/build/version/set.ts @@ -1,4 +1,4 @@ -import { getRuntimeVersionNullable } from '@expo/config-plugins/build/utils/Updates'; +import { getRuntimeVersionNullableAsync } from '@expo/config-plugins/build/utils/Updates'; import { Platform } from '@expo/eas-build-job'; import { EasJsonAccessor, EasJsonUtils } from '@expo/eas-json'; import { Flags } from '@oclif/core'; @@ -116,7 +116,8 @@ export default class BuildVersionSetView extends EasCommand { applicationIdentifier, storeVersion: exp.version ?? '1.0.0', buildVersion: String(version), - runtimeVersion: getRuntimeVersionNullable(exp, platform) ?? undefined, + runtimeVersion: + (await getRuntimeVersionNullableAsync(projectDir, exp, platform)) ?? undefined, }); } } diff --git a/packages/eas-cli/src/commands/channel/rollout.ts b/packages/eas-cli/src/commands/channel/rollout.ts index ce60c1b96e..ee5d8ff44a 100644 --- a/packages/eas-cli/src/commands/channel/rollout.ts +++ b/packages/eas-cli/src/commands/channel/rollout.ts @@ -132,7 +132,7 @@ export default class ChannelRollout extends EasCommand { const { args, flags } = await this.parse(ChannelRollout); const argsAndFlags = this.sanitizeArgsAndFlags({ ...flags, ...args }); const { - privateProjectConfig: { exp, projectId }, + privateProjectConfig: { exp, projectId, projectDir }, loggedIn: { graphqlClient }, } = await this.getContextAsync(ChannelRollout, { nonInteractive: argsAndFlags.nonInteractive, @@ -141,9 +141,8 @@ export default class ChannelRollout extends EasCommand { enableJsonOutput(); } - const app = { projectId, exp }; + const app = { projectId, exp, projectDir }; const ctx = { - projectId, nonInteractive: argsAndFlags.nonInteractive, graphqlClient, app, diff --git a/packages/eas-cli/src/commands/update/__tests__/configure.test.ts b/packages/eas-cli/src/commands/update/__tests__/configure.test.ts deleted file mode 100644 index a93a60f6a0..0000000000 --- a/packages/eas-cli/src/commands/update/__tests__/configure.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ExpoConfig } from '@expo/config'; -import { instance, mock } from 'ts-mockito'; - -import { ExpoGraphqlClient } from '../../../commandUtils/context/contextUtils/createGraphqlClient'; -import { ensureEASUpdateIsConfiguredAsync } from '../../../update/configure'; -import { Client } from '../../../vcs/vcs'; - -describe(ensureEASUpdateIsConfiguredAsync, () => { - it('errors with "useClassicUpdates" set and no app.json', async () => { - const graphqlClient = instance(mock({})); - const vcsClient = instance(mock({})); - const exp: ExpoConfig = { - name: 'test', - slug: 'test', - updates: { useClassicUpdates: true }, - }; - - await expect(async () => { - await ensureEASUpdateIsConfiguredAsync(graphqlClient, { - exp, - projectId: 'test', - projectDir: '/tmp/test', - platform: null, - vcsClient, - }); - }).rejects.toThrow( - `Your app config sets "updates.useClassicUpdates" but EAS Update does not support classic updates. Remove "useClassicUpdates" from your app config and run this command again.` - ); - }); -}); diff --git a/packages/eas-cli/src/commands/update/__tests__/index.test.ts b/packages/eas-cli/src/commands/update/__tests__/index.test.ts index d16c2d1219..0842585b01 100644 --- a/packages/eas-cli/src/commands/update/__tests__/index.test.ts +++ b/packages/eas-cli/src/commands/update/__tests__/index.test.ts @@ -324,7 +324,7 @@ function mockTestExport({ uniqueUploadedAssetPaths: [], }); - jest.mocked(Updates.getRuntimeVersion).mockReturnValue(runtimeVersion); + jest.mocked(Updates.getRuntimeVersionAsync).mockResolvedValue(runtimeVersion); return { inputDir: exportDir, platforms, runtimeVersion }; } diff --git a/packages/eas-cli/src/commands/update/__tests__/roll-back-to-embedded.test.ts b/packages/eas-cli/src/commands/update/__tests__/roll-back-to-embedded.test.ts index 5e4524581a..83e017d217 100644 --- a/packages/eas-cli/src/commands/update/__tests__/roll-back-to-embedded.test.ts +++ b/packages/eas-cli/src/commands/update/__tests__/roll-back-to-embedded.test.ts @@ -84,7 +84,7 @@ describe(UpdateRollBackToEmbedded.name, () => { mockTestProject(); const platforms = ['android', 'ios']; const runtimeVersion = 'exposdk:47.0.0'; - jest.mocked(Updates.getRuntimeVersion).mockReturnValue(runtimeVersion); + jest.mocked(Updates.getRuntimeVersionAsync).mockResolvedValue(runtimeVersion); jest.mocked(ensureBranchExistsAsync).mockResolvedValue({ branchId: 'branch123', @@ -106,7 +106,7 @@ describe(UpdateRollBackToEmbedded.name, () => { const { projectId } = mockTestProject(); const platforms = ['android', 'ios']; const runtimeVersion = 'exposdk:47.0.0'; - jest.mocked(Updates.getRuntimeVersion).mockReturnValue(runtimeVersion); + jest.mocked(Updates.getRuntimeVersionAsync).mockResolvedValue(runtimeVersion); jest.mocked(getBranchNameFromChannelNameAsync).mockResolvedValue('branchFromChannel'); jest.mocked(ensureBranchExistsAsync).mockResolvedValue({ @@ -154,7 +154,7 @@ describe(UpdateRollBackToEmbedded.name, () => { const platforms = ['ios']; const runtimeVersion = 'exposdk:47.0.0'; - jest.mocked(Updates.getRuntimeVersion).mockReturnValue(runtimeVersion); + jest.mocked(Updates.getRuntimeVersionAsync).mockResolvedValue(runtimeVersion); // Mock an existing branch, so we don't create a new one jest.mocked(ensureBranchExistsAsync).mockResolvedValue({ diff --git a/packages/eas-cli/src/commands/update/configure.ts b/packages/eas-cli/src/commands/update/configure.ts index 5f153e432d..f2b04b9268 100644 --- a/packages/eas-cli/src/commands/update/configure.ts +++ b/packages/eas-cli/src/commands/update/configure.ts @@ -35,7 +35,6 @@ export default class UpdateConfigure extends EasCommand { const platform = flags.platform as RequestedPlatform; const { privateProjectConfig: { projectId, exp, projectDir }, - loggedIn: { graphqlClient }, vcsClient, } = await this.getContextAsync(UpdateConfigure, { nonInteractive: flags['non-interactive'], @@ -47,7 +46,7 @@ export default class UpdateConfigure extends EasCommand { await vcsClient.ensureRepoExistsAsync(); - await ensureEASUpdateIsConfiguredAsync(graphqlClient, { + await ensureEASUpdateIsConfiguredAsync({ exp, projectId, projectDir, diff --git a/packages/eas-cli/src/commands/update/index.ts b/packages/eas-cli/src/commands/update/index.ts index 14b570783b..d7c554379b 100644 --- a/packages/eas-cli/src/commands/update/index.ts +++ b/packages/eas-cli/src/commands/update/index.ts @@ -197,7 +197,7 @@ export default class UpdatePublish extends EasCommand { await maybeWarnAboutEasOutagesAsync(graphqlClient, [StatuspageServiceName.EasUpdate]); - await ensureEASUpdateIsConfiguredAsync(graphqlClient, { + await ensureEASUpdateIsConfiguredAsync({ exp: expPossiblyWithoutEasUpdateConfigured, platform: getRequestedPlatform(platformFlag), projectDir, diff --git a/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts b/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts index 1d03b06257..520a0114d4 100644 --- a/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts +++ b/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts @@ -148,7 +148,7 @@ export default class UpdateRollBackToEmbedded extends EasCommand { await maybeWarnAboutEasOutagesAsync(graphqlClient, [StatuspageServiceName.EasUpdate]); - await ensureEASUpdateIsConfiguredAsync(graphqlClient, { + await ensureEASUpdateIsConfiguredAsync({ exp: expPossiblyWithoutEasUpdateConfigured, platform: getRequestedPlatform(platformFlag), projectDir, diff --git a/packages/eas-cli/src/eas-update/__tests__/fixtures.ts b/packages/eas-cli/src/eas-update/__tests__/fixtures.ts index f335711f35..201981fe8f 100644 --- a/packages/eas-cli/src/eas-update/__tests__/fixtures.ts +++ b/packages/eas-cli/src/eas-update/__tests__/fixtures.ts @@ -5,6 +5,6 @@ export function createCtxMock(options: { nonInteractive?: boolean } = {}): EASUp return { graphqlClient: jest.fn() as any, nonInteractive: options.nonInteractive ?? false, - app: { exp: testAppJson, projectId: 'test-project-id' }, + app: { exp: testAppJson, projectId: 'test-project-id', projectDir: '/' }, }; } diff --git a/packages/eas-cli/src/eas-update/utils.ts b/packages/eas-cli/src/eas-update/utils.ts index 537951beca..bdc3f49a13 100644 --- a/packages/eas-cli/src/eas-update/utils.ts +++ b/packages/eas-cli/src/eas-update/utils.ts @@ -5,7 +5,7 @@ import { ExpoGraphqlClient } from '../commandUtils/context/contextUtils/createGr export type EASUpdateContext = { graphqlClient: ExpoGraphqlClient; nonInteractive: boolean; - app: { exp: ExpoConfig; projectId: string }; + app: { exp: ExpoConfig; projectId: string; projectDir: string }; }; export interface EASUpdateAction { diff --git a/packages/eas-cli/src/project/publish.ts b/packages/eas-cli/src/project/publish.ts index a0d3d31533..a0b2095955 100644 --- a/packages/eas-cli/src/project/publish.ts +++ b/packages/eas-cli/src/project/publish.ts @@ -717,20 +717,22 @@ export async function getRuntimeVersionObjectAsync( } } - return [...new Set(platforms)].map(platform => { - if (platform === 'web') { - return { platform: 'web', runtimeVersion: 'UNVERSIONED' }; - } - return { - platform, - runtimeVersion: nullthrows( - Updates.getRuntimeVersion(exp, platform), - `Unable to determine runtime version for ${ - requestedPlatformDisplayNames[platform] - }. ${learnMore('https://docs.expo.dev/eas-update/runtime-versions/')}` - ), - }; - }); + return await Promise.all( + [...new Set(platforms)].map(async platform => { + if (platform === 'web') { + return { platform: 'web', runtimeVersion: 'UNVERSIONED' }; + } + return { + platform, + runtimeVersion: nullthrows( + await Updates.getRuntimeVersionAsync(projectDir, exp, platform), + `Unable to determine runtime version for ${ + requestedPlatformDisplayNames[platform] + }. ${learnMore('https://docs.expo.dev/eas-update/runtime-versions/')}` + ), + }; + }) + ); } export function getRuntimeToPlatformMappingFromRuntimeVersions( diff --git a/packages/eas-cli/src/rollout/actions/CreateRollout.ts b/packages/eas-cli/src/rollout/actions/CreateRollout.ts index 8d3435f2ce..ba3c53f74b 100644 --- a/packages/eas-cli/src/rollout/actions/CreateRollout.ts +++ b/packages/eas-cli/src/rollout/actions/CreateRollout.ts @@ -272,9 +272,13 @@ export class CreateRollout implements EASUpdateAction { const platforms: ('ios' | 'android')[] = ['ios', 'android']; - const runtimes = platforms - .map(platform => Updates.getRuntimeVersion(ctx.app.exp, platform)) - .filter(truthy); + const runtimes = ( + await Promise.all( + platforms.map(platform => + Updates.getRuntimeVersionAsync(ctx.app.projectDir, ctx.app.exp, platform) + ) + ) + ).filter(truthy); const dedupedRuntimes = [...new Set(runtimes)]; if (dedupedRuntimes.length === 0) { diff --git a/packages/eas-cli/src/update/android/UpdatesModule.ts b/packages/eas-cli/src/update/android/UpdatesModule.ts index bc59f522e8..15c3fd2429 100644 --- a/packages/eas-cli/src/update/android/UpdatesModule.ts +++ b/packages/eas-cli/src/update/android/UpdatesModule.ts @@ -1,31 +1,25 @@ import { ExpoConfig } from '@expo/config'; import { AndroidConfig, AndroidManifest, XML } from '@expo/config-plugins'; -import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient'; import { RequestedPlatform } from '../../platform'; -import { getOwnerAccountForProjectIdAsync } from '../../project/projectUtils'; import { ensureValidVersions } from '../utils'; /** * Synchronize updates configuration to native files. This needs to do essentially the same thing as `withUpdates` */ export async function syncUpdatesConfigurationAsync( - graphqlClient: ExpoGraphqlClient, projectDir: string, - exp: ExpoConfig, - projectId: string + exp: ExpoConfig ): Promise { ensureValidVersions(exp, RequestedPlatform.Android); - const accountName = (await getOwnerAccountForProjectIdAsync(graphqlClient, projectId)).name; // sync AndroidManifest.xml const androidManifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(projectDir); const androidManifest = await getAndroidManifestAsync(projectDir); - const updatedAndroidManifest = AndroidConfig.Updates.setUpdatesConfig( + const updatedAndroidManifest = await AndroidConfig.Updates.setUpdatesConfigAsync( projectDir, exp, - androidManifest, - accountName + androidManifest ); await AndroidConfig.Manifest.writeAndroidManifestAsync( androidManifestPath, @@ -37,10 +31,13 @@ export async function syncUpdatesConfigurationAsync( const stringsResourceXML = await AndroidConfig.Resources.readResourcesXMLAsync({ path: stringsJSONPath, }); - const updatedStringsResourceXML = AndroidConfig.Updates.applyRuntimeVersionFromConfig( - exp, - stringsResourceXML - ); + + const updatedStringsResourceXML = + await AndroidConfig.Updates.applyRuntimeVersionFromConfigForProjectRootAsync( + projectDir, + exp, + stringsResourceXML + ); await XML.writeXMLAsync({ path: stringsJSONPath, xml: updatedStringsResourceXML }); } diff --git a/packages/eas-cli/src/update/configure.ts b/packages/eas-cli/src/update/configure.ts index 5ae5e5bfd2..8a13aec1e4 100644 --- a/packages/eas-cli/src/update/configure.ts +++ b/packages/eas-cli/src/update/configure.ts @@ -6,18 +6,16 @@ import fs from 'fs-extra'; import semver from 'semver'; import { getEASUpdateURL } from '../api'; -import { ExpoGraphqlClient } from '../commandUtils/context/contextUtils/createGraphqlClient'; import { AppPlatform } from '../graphql/generated'; import Log, { learnMore } from '../log'; import { RequestedPlatform, appPlatformDisplayNames } from '../platform'; -import { createOrModifyExpoConfigAsync, isUsingStaticExpoConfig } from '../project/expoConfig'; +import { createOrModifyExpoConfigAsync } from '../project/expoConfig'; import { installExpoUpdatesAsync, isExpoUpdatesInstalledAsDevDependency, isExpoUpdatesInstalledOrAvailable, } from '../project/projectUtils'; import { resolveWorkflowPerPlatformAsync } from '../project/workflow'; -import { confirmAsync } from '../prompts'; import { Client } from '../vcs/vcs'; import { syncUpdatesConfigurationAsync as syncAndroidUpdatesConfigurationAsync } from './android/UpdatesModule'; import { syncUpdatesConfigurationAsync as syncIosUpdatesConfigurationAsync } from './ios/UpdatesModule'; @@ -260,29 +258,26 @@ function warnEASUpdatesManualConfig({ * Make sure that the current `app.json` configuration for EAS Updates is set natively. */ async function ensureEASUpdateIsConfiguredNativelyAsync( - graphqlClient: ExpoGraphqlClient, vcsClient: Client, { exp, - projectId, projectDir, platform, workflows, }: { exp: ExpoConfig; - projectId: string; projectDir: string; platform: RequestedPlatform; workflows: Record; } ): Promise { if (['all', 'android'].includes(platform) && workflows.android === Workflow.GENERIC) { - await syncAndroidUpdatesConfigurationAsync(graphqlClient, projectDir, exp, projectId); + await syncAndroidUpdatesConfigurationAsync(projectDir, exp); Log.withTick(`Configured ${chalk.bold('AndroidManifest.xml')} for EAS Update`); } if (['all', 'ios'].includes(platform) && workflows.ios === Workflow.GENERIC) { - await syncIosUpdatesConfigurationAsync(graphqlClient, vcsClient, projectDir, exp, projectId); + await syncIosUpdatesConfigurationAsync(vcsClient, projectDir, exp); Log.withTick(`Configured ${chalk.bold('Expo.plist')} for EAS Update`); } } @@ -356,30 +351,19 @@ export async function ensureEASUpdateIsConfiguredInEasJsonAsync(projectDir: stri * - Sets `updates.url` if not set * - Ensure latest changes are reflected in the native config, if any */ -export async function ensureEASUpdateIsConfiguredAsync( - graphqlClient: ExpoGraphqlClient, - { - exp: expMaybeWithoutUpdates, - projectId, - projectDir, - vcsClient, - platform, - }: { - exp: ExpoConfig; - projectId: string; - projectDir: string; - vcsClient: Client; - platform: RequestedPlatform | null; - } -): Promise { - // EAS Update and SDK 49's "useClassicUpdates" option are mutually exclusive - if (expMaybeWithoutUpdates.updates?.useClassicUpdates) { - expMaybeWithoutUpdates = await ensureUseClassicUpdatesIsRemovedAsync({ - exp: expMaybeWithoutUpdates, - projectDir, - }); - } - +export async function ensureEASUpdateIsConfiguredAsync({ + exp: expMaybeWithoutUpdates, + projectId, + projectDir, + vcsClient, + platform, +}: { + exp: ExpoConfig; + projectId: string; + projectDir: string; + vcsClient: Client; + platform: RequestedPlatform | null; +}): Promise { const hasExpoUpdates = isExpoUpdatesInstalledOrAvailable( projectDir, expMaybeWithoutUpdates.sdkVersion @@ -411,10 +395,9 @@ export async function ensureEASUpdateIsConfiguredAsync( }); if (projectChanged || !hasExpoUpdates) { - await ensureEASUpdateIsConfiguredNativelyAsync(graphqlClient, vcsClient, { + await ensureEASUpdateIsConfiguredNativelyAsync(vcsClient, { exp: expWithUpdates, projectDir, - projectId, platform, workflows, }); @@ -428,49 +411,3 @@ export async function ensureEASUpdateIsConfiguredAsync( Log.newLine(); } } - -export async function ensureUseClassicUpdatesIsRemovedAsync({ - exp: expMaybeWithoutUpdates, - projectDir, -}: { - exp: ExpoConfig; - projectDir: string; -}): Promise { - if (!isUsingStaticExpoConfig(projectDir)) { - throw new Error( - `Your app config sets "updates.useClassicUpdates" but EAS Update does not support classic updates. Remove "useClassicUpdates" from your app config and run this command again.` - ); - } - - const shouldEditConfig = await confirmAsync({ - message: `Your app config sets "updates.useClassicUpdates" but EAS Update does not support classic updates. Remove "updates.useClassicUpdates" from your app config?`, - }); - if (!shouldEditConfig) { - throw new Error( - `Manually remove "updates.useClassicUpdates" from your app config and run this command again.` - ); - } - - const editedExpoConfig = mergeExpoConfig(expMaybeWithoutUpdates, { - updates: { useClassicUpdates: undefined }, - }) as ExpoConfig; - const result = await createOrModifyExpoConfigAsync(projectDir, editedExpoConfig); - - switch (result.type) { - case 'success': - Log.withTick(`Removed "updates.useClassicUpdates"`); - expMaybeWithoutUpdates = editedExpoConfig; - break; - - case 'warn': - case 'fail': - throw new Error(result.message); - - default: - throw new Error( - `Unexpected result type "${result.type}" received when modifying the project config.` - ); - } - - return editedExpoConfig; -} diff --git a/packages/eas-cli/src/update/ios/UpdatesModule.ts b/packages/eas-cli/src/update/ios/UpdatesModule.ts index 0a79d718fb..df4bbc26ed 100644 --- a/packages/eas-cli/src/update/ios/UpdatesModule.ts +++ b/packages/eas-cli/src/update/ios/UpdatesModule.ts @@ -1,28 +1,22 @@ import { ExpoConfig } from '@expo/config'; import { IOSConfig } from '@expo/config-plugins'; -import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient'; import { RequestedPlatform } from '../../platform'; -import { getOwnerAccountForProjectIdAsync } from '../../project/projectUtils'; import { readPlistAsync, writePlistAsync } from '../../utils/plist'; import { Client } from '../../vcs/vcs'; import { ensureValidVersions } from '../utils'; export async function syncUpdatesConfigurationAsync( - graphqlClient: ExpoGraphqlClient, vcsClient: Client, projectDir: string, - exp: ExpoConfig, - projectId: string + exp: ExpoConfig ): Promise { ensureValidVersions(exp, RequestedPlatform.Ios); - const accountName = (await getOwnerAccountForProjectIdAsync(graphqlClient, projectId)).name; const expoPlist = await readExpoPlistAsync(projectDir); - const updatedExpoPlist = IOSConfig.Updates.setUpdatesConfig( + const updatedExpoPlist = await IOSConfig.Updates.setUpdatesConfigAsync( projectDir, exp, - expoPlist, - accountName + expoPlist ); await writeExpoPlistAsync(vcsClient, projectDir, updatedExpoPlist); } diff --git a/yarn.lock b/yarn.lock index 24d17d0f55..2f3f717eba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1209,14 +1209,15 @@ node-forge "^1.2.1" nullthrows "^1.1.1" -"@expo/config-plugins@7.2.4", "@expo/config-plugins@~7.2.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-7.2.4.tgz#c8d354348b746e53d70224f0bf7b87994f7c2936" - integrity sha512-TItGwmKH1GDjA5GlMkXo1A8pqeqppSK40aSVRVQaGZraUj+nuvtpWxNgEWZxWFumiatP2ocWwyWVjfmH+rJY6g== - dependencies: - "@expo/config-types" "^49.0.0-alpha.1" - "@expo/json-file" "~8.2.37" - "@expo/plist" "^0.0.20" +"@expo/config-plugins@7.8.2", "@expo/config-plugins@~7.8.0", "@expo/config-plugins@~7.8.2": + version "7.8.2" + resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-7.8.2.tgz#c00ce93c4d6c2cb9e345ed9cd56ceeea05ab8ddb" + integrity sha512-XM2eXA5EvcpmXFCui48+bVy8GTskYSjPf2yC+LliYv8PDcedu7+pdgmbnvH4eZCyHfTMO8/UiF+w8e5WgOEj5A== + dependencies: + "@expo/config-types" "^50.0.0-alpha.1" + "@expo/fingerprint" "^0.6.0" + "@expo/json-file" "~8.3.0" + "@expo/plist" "^0.1.0" "@expo/sdk-runtime-versions" "^1.0.0" "@react-native/normalize-color" "^2.0.0" chalk "^4.1.2" @@ -1227,22 +1228,23 @@ resolve-from "^5.0.0" semver "^7.5.3" slash "^3.0.0" + slugify "^1.6.6" xcode "^3.0.1" xml2js "0.6.0" -"@expo/config-types@49.0.0", "@expo/config-types@^49.0.0-alpha.1": - version "49.0.0" - resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-49.0.0.tgz#15ffef715285c06703f6fb7ec0cda853f645cc09" - integrity sha512-8eyREVi+K2acnMBe/rTIu1dOfyR2+AMnTLHlut+YpMV9OZPdeKV0Bs9BxAewGqBA2slslbQ9N39IS2CuTKpXkA== +"@expo/config-types@50.0.0", "@expo/config-types@^50.0.0", "@expo/config-types@^50.0.0-alpha.1": + version "50.0.0" + resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-50.0.0.tgz#b534d3ec997ec60f8af24f6ad56244c8afc71a0b" + integrity sha512-0kkhIwXRT6EdFDwn+zTg9R2MZIAEYGn1MVkyRohAd+C9cXOb5RA8WLQi7vuxKF9m1SMtNAUrf0pO+ENK0+/KSw== -"@expo/config@8.1.2", "@expo/config@~8.1.0": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@expo/config/-/config-8.1.2.tgz#7fff28b3acefe39702e9f3ce1c9fd896a52caa80" - integrity sha512-4e7hzPj50mQIlsrzOH6XZ36O094mPfPTIDIH4yv49bWNMc7GFLTofB/lcT+QyxiLaJuC0Wlk9yOLB8DIqmtwug== +"@expo/config@8.5.2", "@expo/config@~8.5.0": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@expo/config/-/config-8.5.2.tgz#4a0de82279337a37b5f1f0958711fe56e8ea31c2" + integrity sha512-UYy9kWxjQAEDwlX7gwLk0+8IxGPcHJMLnYRYtR5C5xGIV+ML7tCA+qFz1p4gHZRPkJD+k7iZyqBtyqt8xm+zXw== dependencies: "@babel/code-frame" "~7.10.4" - "@expo/config-plugins" "~7.2.0" - "@expo/config-types" "^49.0.0-alpha.1" + "@expo/config-plugins" "~7.8.2" + "@expo/config-types" "^50.0.0" "@expo/json-file" "^8.2.37" getenv "^1.0.0" glob "7.1.6" @@ -1260,24 +1262,36 @@ joi "^17.9.2" semver "^7.5.4" -"@expo/image-utils@0.3.22": - version "0.3.22" - resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.3.22.tgz#3a45fb2e268d20fcc761c87bca3aca7fd8e24260" - integrity sha512-uzq+RERAtkWypOFOLssFnXXqEqKjNj9eXN7e97d/EXUAojNcLDoXc0sL+F5B1I4qtlsnhX01kcpoIBBZD8wZNQ== +"@expo/fingerprint@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@expo/fingerprint/-/fingerprint-0.6.0.tgz#77366934673d4ecea37284109b4dd67f9e6a7487" + integrity sha512-KfpoVRTMwMNJ/Cf5o+Ou8M/Y0EGSTqK+rbi70M2Y0K2qgWNfMJ1gm6sYO9uc8lcTr7YSYM1Rme3dk7QXhpScNA== + dependencies: + "@expo/spawn-async" "^1.5.0" + chalk "^4.1.2" + debug "^4.3.4" + find-up "^5.0.0" + minimatch "^3.0.4" + p-limit "^3.1.0" + resolve-from "^5.0.0" + +"@expo/image-utils@^0.4.0": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.4.1.tgz#78c54b8aaa974d0ac37fee5285683b54ff161b2c" + integrity sha512-EZb+VHSmw+a5s2hS9qksTcWylY0FDaIAVufcxoaRS9tHIXLjW5zcKW7Rhj9dSEbZbRVy9yXXdHKa3GQdUQIOFw== dependencies: "@expo/spawn-async" "1.5.0" chalk "^4.0.0" fs-extra "9.0.0" getenv "^1.0.0" jimp-compact "0.16.1" - mime "^2.4.4" node-fetch "^2.6.0" parse-png "^2.1.0" resolve-from "^5.0.0" semver "7.3.2" tempy "0.3.0" -"@expo/json-file@8.2.37", "@expo/json-file@^8.2.37", "@expo/json-file@~8.2.37": +"@expo/json-file@8.2.37", "@expo/json-file@^8.2.37": version "8.2.37" resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.37.tgz#9c02d3b42134907c69cc0a027b18671b69344049" integrity sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q== @@ -1286,6 +1300,15 @@ json5 "^2.2.2" write-file-atomic "^2.3.0" +"@expo/json-file@~8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.3.0.tgz#fc84af77b532a4e9bfb5beafd0e3b7f692b6bd7e" + integrity sha512-yROUeXJXR5goagB8c3muFLCzLmdGOvoPpR5yDNaXrnTp4euNykr9yW0wWhJx4YVRTNOPtGBnEbbJBW+a9q+S6g== + dependencies: + "@babel/code-frame" "~7.10.4" + json5 "^2.2.2" + write-file-atomic "^2.3.0" + "@expo/logger@1.0.37": version "1.0.37" resolved "https://registry.yarnpkg.com/@expo/logger/-/logger-1.0.37.tgz#79b2336d4e9ed70bd19a53168eb91d6a899f11d8" @@ -1335,7 +1358,7 @@ dependencies: node-forge "^1.2.1" -"@expo/plist@0.0.20", "@expo/plist@^0.0.20": +"@expo/plist@0.0.20": version "0.0.20" resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.20.tgz#a6b3124438031c02b762bad5a47b70584d3c0072" integrity sha512-UXQ4LXCfTZ580LDHGJ5q62jSTwJFFJ1GqBu8duQMThiHKWbMJ+gajJh6rsB6EJ3aLUr9wcauxneL5LVRFxwBEA== @@ -1344,6 +1367,15 @@ base64-js "^1.2.3" xmlbuilder "^14.0.0" +"@expo/plist@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.1.0.tgz#eabc95f951d14e10c87fd0443ee01d567371f058" + integrity sha512-xWD+8vIFif0wKyuqe3fmnmnSouXYucciZXFzS0ZD5OV9eSAS1RGQI5FaGGJ6zxJ4mpdy/4QzbLdBjnYE5vxA0g== + dependencies: + "@xmldom/xmldom" "~0.7.7" + base64-js "^1.2.3" + xmlbuilder "^14.0.0" + "@expo/plugin-help@5.1.23": version "5.1.23" resolved "https://registry.yarnpkg.com/@expo/plugin-help/-/plugin-help-5.1.23.tgz#36d82111ec6c0e9870a3f0856ae7536186624912" @@ -1365,15 +1397,15 @@ semver "^7.3.7" tslib "^2.4.0" -"@expo/prebuild-config@6.2.5": - version "6.2.5" - resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-6.2.5.tgz#2e7fdce8ddef3ac97fa05b4542f2b62a43bcea4b" - integrity sha512-XHgQ4OWZ03rzczD+D2ulQRjyHCVnA36cfX4q+r2x1Say4hI7lIg75ZQEsWdEMU9rZV8TbDUtZlPL4pxNWpYu7Q== +"@expo/prebuild-config@6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-6.7.2.tgz#a6107394d92ce0105534a0b7e63aa5599b720fdd" + integrity sha512-Z1GyWfl923wU29YQg6Xik4URls4qcIddWA4vLhW6mUgiRhC3HCf1keHEzK5AtWsrga4bH/H+usAY0OltgABW1w== dependencies: - "@expo/config" "~8.1.0" - "@expo/config-plugins" "~7.2.0" - "@expo/config-types" "^49.0.0-alpha.1" - "@expo/image-utils" "0.3.22" + "@expo/config" "~8.5.0" + "@expo/config-plugins" "~7.8.0" + "@expo/config-types" "^50.0.0-alpha.1" + "@expo/image-utils" "^0.4.0" "@expo/json-file" "^8.2.37" debug "^4.3.1" fs-extra "^9.0.0" @@ -10216,11 +10248,6 @@ mime@3.0.0: resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== -mime@^2.4.4: - version "2.5.2" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" - integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -12605,6 +12632,11 @@ slugify@^1.3.4: resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.4.5.tgz#a7517acf5f4c02a4df41e735354b660a4ed1efcf" integrity sha512-WpECLAgYaxHoEAJ8Q1Lo8HOs1ngn7LN7QjXgOLbmmfkcWvosyk4ZTXkTzKyhngK640USTZUlgoQJfED1kz5fnQ== +slugify@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" + integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== + smart-buffer@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba"