eas-cli 3.13.3 → 3.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +55 -55
  2. package/build/api.d.ts +1 -0
  3. package/build/api.js +14 -1
  4. package/build/build/configure.d.ts +1 -0
  5. package/build/build/configure.js +8 -4
  6. package/build/build/local.js +1 -1
  7. package/build/build/runBuildAndSubmit.js +29 -0
  8. package/build/commandUtils/EasCommand.js +3 -1
  9. package/build/commandUtils/context/contextUtils/getProjectIdAsync.js +3 -3
  10. package/build/commands/account/login.d.ts +3 -0
  11. package/build/commands/account/login.js +12 -1
  12. package/build/commands/build/configure.js +5 -1
  13. package/build/commands/project/init.js +1 -1
  14. package/build/commands/update/configure.js +14 -15
  15. package/build/credentials/android/api/GraphqlClient.d.ts +1 -0
  16. package/build/credentials/android/api/GraphqlClient.js +5 -7
  17. package/build/credentials/android/api/graphql/mutations/AndroidAppBuildCredentialsMutation.d.ts +1 -0
  18. package/build/credentials/android/api/graphql/mutations/AndroidAppBuildCredentialsMutation.js +23 -0
  19. package/build/credentials/ios/appstore/bundleIdCapabilities.js +43 -0
  20. package/build/credentials/manager/Actions.d.ts +11 -10
  21. package/build/credentials/manager/Actions.js +11 -10
  22. package/build/credentials/manager/AndroidActions.js +5 -0
  23. package/build/credentials/manager/CreateAndroidBuildCredentials.d.ts +8 -0
  24. package/build/credentials/manager/CreateAndroidBuildCredentials.js +33 -0
  25. package/build/credentials/manager/ManageAndroid.js +6 -15
  26. package/build/credentials/manager/SetDefaultAndroidKeystore.d.ts +8 -0
  27. package/build/credentials/manager/SetDefaultAndroidKeystore.js +41 -0
  28. package/build/graphql/generated.d.ts +76 -12
  29. package/build/graphql/generated.js +13 -2
  30. package/build/graphql/queries/UserQuery.js +2 -5
  31. package/build/project/expoConfig.d.ts +5 -1
  32. package/build/project/expoConfig.js +58 -1
  33. package/build/project/projectUtils.d.ts +2 -0
  34. package/build/project/projectUtils.js +14 -3
  35. package/build/update/configure.js +9 -5
  36. package/build/user/SessionManager.d.ts +3 -1
  37. package/build/user/SessionManager.js +16 -2
  38. package/build/user/User.d.ts +1 -1
  39. package/build/user/User.js +1 -1
  40. package/build/user/actions.js +1 -1
  41. package/build/user/expoSsoLauncher.d.ts +4 -0
  42. package/build/user/expoSsoLauncher.js +71 -0
  43. package/build/user/fetchSessionSecretAndSsoUser.d.ts +5 -0
  44. package/build/user/fetchSessionSecretAndSsoUser.js +20 -0
  45. package/build/user/fetchSessionSecretAndUser.js +4 -24
  46. package/build/user/fetchUser.d.ts +6 -0
  47. package/build/user/fetchUser.js +27 -0
  48. package/build/utils/expoCli.js +12 -2
  49. package/build/utils/port.d.ts +2 -0
  50. package/build/utils/port.js +14 -0
  51. package/build/vcs/clients/git.js +1 -1
  52. package/oclif.manifest.json +1 -1
  53. package/package.json +5 -4
@@ -996,6 +996,7 @@ export type AppBuildsPaginatedArgs = {
996
996
  export type AppChannelsPaginatedArgs = {
997
997
  after?: InputMaybe<Scalars['String']>;
998
998
  before?: InputMaybe<Scalars['String']>;
999
+ filter?: InputMaybe<ChannelFilterInput>;
999
1000
  first?: InputMaybe<Scalars['Int']>;
1000
1001
  last?: InputMaybe<Scalars['Int']>;
1001
1002
  };
@@ -1148,6 +1149,7 @@ export type AppInput = {
1148
1149
  };
1149
1150
  export type AppInsights = {
1150
1151
  __typename?: 'AppInsights';
1152
+ hasEventsFromExpoInsightsClientModule: Scalars['Boolean'];
1151
1153
  totalUniqueUsers?: Maybe<Scalars['Int']>;
1152
1154
  uniqueUsersByAppVersionOverTime: UniqueUsersOverTimeData;
1153
1155
  uniqueUsersByPlatformOverTime: UniqueUsersOverTimeData;
@@ -1647,6 +1649,37 @@ export type AssetQueryMetadataArgs = {
1647
1649
  export declare enum AuthProtocolType {
1648
1650
  Oidc = "OIDC"
1649
1651
  }
1652
+ export type BackgroundJobReceipt = {
1653
+ __typename?: 'BackgroundJobReceipt';
1654
+ account: Account;
1655
+ createdAt: Scalars['DateTime'];
1656
+ errorCode?: Maybe<Scalars['String']>;
1657
+ errorMessage?: Maybe<Scalars['String']>;
1658
+ id: Scalars['ID'];
1659
+ resultId?: Maybe<Scalars['ID']>;
1660
+ resultType: BackgroundJobResultType;
1661
+ state: BackgroundJobState;
1662
+ tries: Scalars['Int'];
1663
+ updatedAt: Scalars['DateTime'];
1664
+ willRetry: Scalars['Boolean'];
1665
+ };
1666
+ export type BackgroundJobReceiptQuery = {
1667
+ __typename?: 'BackgroundJobReceiptQuery';
1668
+ /** Look up background job receipt by ID */
1669
+ byId: BackgroundJobReceipt;
1670
+ };
1671
+ export type BackgroundJobReceiptQueryByIdArgs = {
1672
+ id: Scalars['ID'];
1673
+ };
1674
+ export declare enum BackgroundJobResultType {
1675
+ GithubBuild = "GITHUB_BUILD"
1676
+ }
1677
+ export declare enum BackgroundJobState {
1678
+ Failure = "FAILURE",
1679
+ InProgress = "IN_PROGRESS",
1680
+ Queued = "QUEUED",
1681
+ Success = "SUCCESS"
1682
+ }
1650
1683
  export type Billing = {
1651
1684
  __typename?: 'Billing';
1652
1685
  /** History of invoices */
@@ -2077,6 +2110,9 @@ export type Card = {
2077
2110
  expYear?: Maybe<Scalars['Int']>;
2078
2111
  last4?: Maybe<Scalars['String']>;
2079
2112
  };
2113
+ export type ChannelFilterInput = {
2114
+ searchTerm?: InputMaybe<Scalars['String']>;
2115
+ };
2080
2116
  export type Charge = {
2081
2117
  __typename?: 'Charge';
2082
2118
  amount: Scalars['Int'];
@@ -2517,8 +2553,8 @@ export declare enum GitHubAppInstallationStatus {
2517
2553
  }
2518
2554
  export type GitHubAppMutation = {
2519
2555
  __typename?: 'GitHubAppMutation';
2520
- /** Create a GitHub build for an app */
2521
- createGitHubBuild: Scalars['Boolean'];
2556
+ /** Create a GitHub build for an app. Returns the ID of the background job receipt. Use BackgroundJobReceiptQuery to get the status of the job. */
2557
+ createGitHubBuild: BackgroundJobReceipt;
2522
2558
  };
2523
2559
  export type GitHubAppMutationCreateGitHubBuildArgs = {
2524
2560
  buildInput: GitHubBuildInput;
@@ -3439,6 +3475,7 @@ export type RootQuery = {
3439
3475
  /** Top-level query object for querying Apple Teams. */
3440
3476
  appleTeam: AppleTeamQuery;
3441
3477
  asset: AssetQuery;
3478
+ backgroundJobReceipt: BackgroundJobReceiptQuery;
3442
3479
  buildJobs: BuildJobQuery;
3443
3480
  buildOrBuildJob: BuildOrBuildJobQuery;
3444
3481
  /** Top-level query object for querying BuildPublicData publicly. */
@@ -3526,6 +3563,7 @@ export type SsoUser = Actor & UserActor & {
3526
3563
  /** Coalesced project activity for all apps belonging to all accounts this user belongs to. Only resolves for the viewer. */
3527
3564
  activityTimelineProjectActivities: Array<ActivityTimelineProjectActivity>;
3528
3565
  appCount: Scalars['Int'];
3566
+ /** @deprecated No longer supported */
3529
3567
  appetizeCode?: Maybe<Scalars['String']>;
3530
3568
  /** Apps this user has published. If this user is the viewer, this field returns the apps the user has access to. */
3531
3569
  apps: Array<App>;
@@ -3543,11 +3581,14 @@ export type SsoUser = Actor & UserActor & {
3543
3581
  fullName?: Maybe<Scalars['String']>;
3544
3582
  /** GitHub account linked to a user */
3545
3583
  githubUser?: Maybe<GitHubUser>;
3584
+ /** @deprecated No longer supported */
3546
3585
  githubUsername?: Maybe<Scalars['String']>;
3547
3586
  id: Scalars['ID'];
3587
+ /** @deprecated No longer supported */
3548
3588
  industry?: Maybe<Scalars['String']>;
3549
3589
  isExpoAdmin: Scalars['Boolean'];
3550
3590
  lastName?: Maybe<Scalars['String']>;
3591
+ /** @deprecated No longer supported */
3551
3592
  location?: Maybe<Scalars['String']>;
3552
3593
  notificationSubscriptions: Array<NotificationSubscription>;
3553
3594
  /** Associated accounts */
@@ -3555,6 +3596,7 @@ export type SsoUser = Actor & UserActor & {
3555
3596
  profilePhoto: Scalars['String'];
3556
3597
  /** Snacks associated with this account */
3557
3598
  snacks: Array<Snack>;
3599
+ /** @deprecated No longer supported */
3558
3600
  twitterUsername?: Maybe<Scalars['String']>;
3559
3601
  username: Scalars['String'];
3560
3602
  };
@@ -3585,11 +3627,7 @@ export type SsoUserSnacksArgs = {
3585
3627
  };
3586
3628
  export type SsoUserDataInput = {
3587
3629
  firstName?: InputMaybe<Scalars['String']>;
3588
- githubUsername?: InputMaybe<Scalars['String']>;
3589
- industry?: InputMaybe<Scalars['String']>;
3590
3630
  lastName?: InputMaybe<Scalars['String']>;
3591
- location?: InputMaybe<Scalars['String']>;
3592
- twitterUsername?: InputMaybe<Scalars['String']>;
3593
3631
  };
3594
3632
  export type SsoUserQuery = {
3595
3633
  __typename?: 'SSOUserQuery';
@@ -3975,6 +4013,7 @@ export type Update = ActivityTimelineProjectActivity & {
3975
4013
  };
3976
4014
  export type UpdateBranch = {
3977
4015
  __typename?: 'UpdateBranch';
4016
+ app: App;
3978
4017
  appId: Scalars['ID'];
3979
4018
  createdAt: Scalars['DateTime'];
3980
4019
  id: Scalars['ID'];
@@ -4022,6 +4061,7 @@ export type UpdateBranchMutationPublishUpdateGroupsArgs = {
4022
4061
  };
4023
4062
  export type UpdateChannel = {
4024
4063
  __typename?: 'UpdateChannel';
4064
+ app: App;
4025
4065
  appId: Scalars['ID'];
4026
4066
  branchMapping: Scalars['String'];
4027
4067
  createdAt: Scalars['DateTime'];
@@ -4146,6 +4186,7 @@ export type User = Actor & UserActor & {
4146
4186
  /** Coalesced project activity for all apps belonging to all accounts this user belongs to. Only resolves for the viewer. */
4147
4187
  activityTimelineProjectActivities: Array<ActivityTimelineProjectActivity>;
4148
4188
  appCount: Scalars['Int'];
4189
+ /** @deprecated No longer supported */
4149
4190
  appetizeCode?: Maybe<Scalars['String']>;
4150
4191
  /** Apps this user has published */
4151
4192
  apps: Array<App>;
@@ -4165,16 +4206,19 @@ export type User = Actor & UserActor & {
4165
4206
  fullName?: Maybe<Scalars['String']>;
4166
4207
  /** GitHub account linked to a user */
4167
4208
  githubUser?: Maybe<GitHubUser>;
4209
+ /** @deprecated No longer supported */
4168
4210
  githubUsername?: Maybe<Scalars['String']>;
4169
4211
  /** Whether this user has any pending user invitations. Only resolves for the viewer. */
4170
4212
  hasPendingUserInvitations: Scalars['Boolean'];
4171
4213
  id: Scalars['ID'];
4214
+ /** @deprecated No longer supported */
4172
4215
  industry?: Maybe<Scalars['String']>;
4173
4216
  isExpoAdmin: Scalars['Boolean'];
4174
- /** @deprecated This field no longer exists */
4217
+ /** @deprecated No longer supported */
4175
4218
  isLegacy: Scalars['Boolean'];
4176
4219
  isSecondFactorAuthenticationEnabled: Scalars['Boolean'];
4177
4220
  lastName?: Maybe<Scalars['String']>;
4221
+ /** @deprecated No longer supported */
4178
4222
  location?: Maybe<Scalars['String']>;
4179
4223
  notificationSubscriptions: Array<NotificationSubscription>;
4180
4224
  /** Pending UserInvitations for this user. Only resolves for the viewer. */
@@ -4186,6 +4230,7 @@ export type User = Actor & UserActor & {
4186
4230
  secondFactorDevices: Array<UserSecondFactorDevice>;
4187
4231
  /** Snacks associated with this account */
4188
4232
  snacks: Array<Snack>;
4233
+ /** @deprecated No longer supported */
4189
4234
  twitterUsername?: Maybe<Scalars['String']>;
4190
4235
  username: Scalars['String'];
4191
4236
  };
@@ -4225,6 +4270,7 @@ export type UserActor = {
4225
4270
  */
4226
4271
  activityTimelineProjectActivities: Array<ActivityTimelineProjectActivity>;
4227
4272
  appCount: Scalars['Int'];
4273
+ /** @deprecated No longer supported */
4228
4274
  appetizeCode?: Maybe<Scalars['String']>;
4229
4275
  /** Apps this user has published */
4230
4276
  apps: Array<App>;
@@ -4246,11 +4292,14 @@ export type UserActor = {
4246
4292
  fullName?: Maybe<Scalars['String']>;
4247
4293
  /** GitHub account linked to a user */
4248
4294
  githubUser?: Maybe<GitHubUser>;
4295
+ /** @deprecated No longer supported */
4249
4296
  githubUsername?: Maybe<Scalars['String']>;
4250
4297
  id: Scalars['ID'];
4298
+ /** @deprecated No longer supported */
4251
4299
  industry?: Maybe<Scalars['String']>;
4252
4300
  isExpoAdmin: Scalars['Boolean'];
4253
4301
  lastName?: Maybe<Scalars['String']>;
4302
+ /** @deprecated No longer supported */
4254
4303
  location?: Maybe<Scalars['String']>;
4255
4304
  notificationSubscriptions: Array<NotificationSubscription>;
4256
4305
  /** Associated accounts */
@@ -4258,6 +4307,7 @@ export type UserActor = {
4258
4307
  profilePhoto: Scalars['String'];
4259
4308
  /** Snacks associated with this user's personal account */
4260
4309
  snacks: Array<Snack>;
4310
+ /** @deprecated No longer supported */
4261
4311
  twitterUsername?: Maybe<Scalars['String']>;
4262
4312
  username: Scalars['String'];
4263
4313
  };
@@ -4300,17 +4350,12 @@ export type UserActorQueryByUsernameArgs = {
4300
4350
  username: Scalars['String'];
4301
4351
  };
4302
4352
  export type UserDataInput = {
4303
- appetizeCode?: InputMaybe<Scalars['String']>;
4304
4353
  email?: InputMaybe<Scalars['String']>;
4305
4354
  firstName?: InputMaybe<Scalars['String']>;
4306
4355
  fullName?: InputMaybe<Scalars['String']>;
4307
- githubUsername?: InputMaybe<Scalars['String']>;
4308
4356
  id?: InputMaybe<Scalars['ID']>;
4309
- industry?: InputMaybe<Scalars['String']>;
4310
4357
  lastName?: InputMaybe<Scalars['String']>;
4311
- location?: InputMaybe<Scalars['String']>;
4312
4358
  profilePhoto?: InputMaybe<Scalars['String']>;
4313
- twitterUsername?: InputMaybe<Scalars['String']>;
4314
4359
  username?: InputMaybe<Scalars['String']>;
4315
4360
  };
4316
4361
  /** An pending invitation sent to an email granting membership on an Account. */
@@ -9094,6 +9139,25 @@ export type CurrentUserQuery = {
9094
9139
  id: string;
9095
9140
  featureGates: any;
9096
9141
  isExpoAdmin: boolean;
9142
+ primaryAccount: {
9143
+ __typename?: 'Account';
9144
+ id: string;
9145
+ name: string;
9146
+ users: Array<{
9147
+ __typename?: 'UserPermission';
9148
+ role: Role;
9149
+ actor: {
9150
+ __typename?: 'Robot';
9151
+ id: string;
9152
+ } | {
9153
+ __typename?: 'SSOUser';
9154
+ id: string;
9155
+ } | {
9156
+ __typename?: 'User';
9157
+ id: string;
9158
+ };
9159
+ }>;
9160
+ };
9097
9161
  accounts: Array<{
9098
9162
  __typename?: 'Account';
9099
9163
  id: string;
@@ -6,8 +6,8 @@
6
6
  * For more info and docs, visit https://graphql-code-generator.com/
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.StandardOffer = exports.SecondFactorMethod = exports.Role = exports.ProjectArchiveSourceType = exports.Permission = exports.Order = exports.OfferType = exports.NotificationType = exports.NotificationEvent = exports.MailchimpTag = exports.MailchimpAudience = exports.IosSchemeBuildConfiguration = exports.IosManagedBuildType = exports.IosDistributionType = exports.IosBuildType = exports.InvoiceDiscountType = exports.GitHubAppInstallationStatus = exports.GitHubAppEnvironment = exports.Feature = exports.EnvironmentSecretType = exports.EasTotalPlanEnablementUnit = exports.EasServiceMetric = exports.EasService = exports.EasBuildDeprecationInfoType = exports.EasBuildBillingResourceClass = exports.DistributionType = exports.BuildWorkflow = exports.BuildTrigger = exports.BuildStatus = exports.BuildRetryDisabledReason = exports.BuildResourceClass = exports.BuildPriority = exports.BuildMode = exports.BuildJobStatus = exports.BuildJobLogsFormat = exports.BuildIosEnterpriseProvisioning = exports.BuildCredentialsSource = exports.AuthProtocolType = exports.AssetMetadataStatus = exports.AppsFilter = exports.AppleDeviceClass = exports.AppStoreConnectUserRole = exports.AppSort = exports.AppPrivacy = exports.AppPlatform = exports.AndroidKeystoreType = exports.AndroidFcmVersion = exports.AndroidBuildType = exports.ActivityTimelineProjectActivityType = exports.AccountAppsSortByField = void 0;
10
- exports.WebhookType = exports.UsageMetricsGranularity = exports.UsageMetricType = exports.UploadSessionType = exports.SubmissionStatus = exports.SubmissionArchiveSourceType = exports.SubmissionAndroidTrack = exports.SubmissionAndroidReleaseStatus = exports.SubmissionAndroidArchiveType = exports.StatuspageServiceStatus = exports.StatuspageServiceName = exports.StatuspageIncidentStatus = exports.StatuspageIncidentImpact = void 0;
9
+ exports.Role = exports.ProjectArchiveSourceType = exports.Permission = exports.Order = exports.OfferType = exports.NotificationType = exports.NotificationEvent = exports.MailchimpTag = exports.MailchimpAudience = exports.IosSchemeBuildConfiguration = exports.IosManagedBuildType = exports.IosDistributionType = exports.IosBuildType = exports.InvoiceDiscountType = exports.GitHubAppInstallationStatus = exports.GitHubAppEnvironment = exports.Feature = exports.EnvironmentSecretType = exports.EasTotalPlanEnablementUnit = exports.EasServiceMetric = exports.EasService = exports.EasBuildDeprecationInfoType = exports.EasBuildBillingResourceClass = exports.DistributionType = exports.BuildWorkflow = exports.BuildTrigger = exports.BuildStatus = exports.BuildRetryDisabledReason = exports.BuildResourceClass = exports.BuildPriority = exports.BuildMode = exports.BuildJobStatus = exports.BuildJobLogsFormat = exports.BuildIosEnterpriseProvisioning = exports.BuildCredentialsSource = exports.BackgroundJobState = exports.BackgroundJobResultType = exports.AuthProtocolType = exports.AssetMetadataStatus = exports.AppsFilter = exports.AppleDeviceClass = exports.AppStoreConnectUserRole = exports.AppSort = exports.AppPrivacy = exports.AppPlatform = exports.AndroidKeystoreType = exports.AndroidFcmVersion = exports.AndroidBuildType = exports.ActivityTimelineProjectActivityType = exports.AccountAppsSortByField = void 0;
10
+ exports.WebhookType = exports.UsageMetricsGranularity = exports.UsageMetricType = exports.UploadSessionType = exports.SubmissionStatus = exports.SubmissionArchiveSourceType = exports.SubmissionAndroidTrack = exports.SubmissionAndroidReleaseStatus = exports.SubmissionAndroidArchiveType = exports.StatuspageServiceStatus = exports.StatuspageServiceName = exports.StatuspageIncidentStatus = exports.StatuspageIncidentImpact = exports.StandardOffer = exports.SecondFactorMethod = void 0;
11
11
  var AccountAppsSortByField;
12
12
  (function (AccountAppsSortByField) {
13
13
  AccountAppsSortByField["LatestActivityTime"] = "LATEST_ACTIVITY_TIME";
@@ -100,6 +100,17 @@ var AuthProtocolType;
100
100
  (function (AuthProtocolType) {
101
101
  AuthProtocolType["Oidc"] = "OIDC";
102
102
  })(AuthProtocolType = exports.AuthProtocolType || (exports.AuthProtocolType = {}));
103
+ var BackgroundJobResultType;
104
+ (function (BackgroundJobResultType) {
105
+ BackgroundJobResultType["GithubBuild"] = "GITHUB_BUILD";
106
+ })(BackgroundJobResultType = exports.BackgroundJobResultType || (exports.BackgroundJobResultType = {}));
107
+ var BackgroundJobState;
108
+ (function (BackgroundJobState) {
109
+ BackgroundJobState["Failure"] = "FAILURE";
110
+ BackgroundJobState["InProgress"] = "IN_PROGRESS";
111
+ BackgroundJobState["Queued"] = "QUEUED";
112
+ BackgroundJobState["Success"] = "SUCCESS";
113
+ })(BackgroundJobState = exports.BackgroundJobState || (exports.BackgroundJobState = {}));
103
114
  var BuildCredentialsSource;
104
115
  (function (BuildCredentialsSource) {
105
116
  BuildCredentialsSource["Local"] = "LOCAL";
@@ -14,7 +14,7 @@ exports.UserQuery = {
14
14
  meActor {
15
15
  __typename
16
16
  id
17
- ... on User {
17
+ ... on UserActor {
18
18
  username
19
19
  primaryAccount {
20
20
  id
@@ -24,9 +24,6 @@ exports.UserQuery = {
24
24
  ... on Robot {
25
25
  firstName
26
26
  }
27
- ... on SSOUser {
28
- username
29
- }
30
27
  accounts {
31
28
  id
32
29
  ...AccountFragment
@@ -37,7 +34,7 @@ exports.UserQuery = {
37
34
  }
38
35
  ${(0, graphql_1.print)(Account_1.AccountFragmentNode)}
39
36
  `, {}, {
40
- additionalTypenames: ['User'],
37
+ additionalTypenames: ['User', 'SSOUser'],
41
38
  })
42
39
  .toPromise());
43
40
  return data.meActor;
@@ -1,4 +1,4 @@
1
- import { ExpoConfig } from '@expo/config';
1
+ import { ExpoConfig, modifyConfigAsync } from '@expo/config';
2
2
  import { Env } from '@expo/eas-build-job';
3
3
  export type PublicExpoConfig = Omit<ExpoConfig, '_internal' | 'hooks' | 'ios' | 'android' | 'updates'> & {
4
4
  ios?: Omit<ExpoConfig['ios'], 'config'>;
@@ -9,5 +9,9 @@ export interface ExpoConfigOptions {
9
9
  env?: Env;
10
10
  skipSDKVersionRequirement?: boolean;
11
11
  }
12
+ export declare function createOrModifyExpoConfigAsync(projectDir: string, exp: Partial<ExpoConfig>, readOptions?: {
13
+ skipSDKVersionRequirement?: boolean;
14
+ }): ReturnType<typeof modifyConfigAsync>;
12
15
  export declare function getPrivateExpoConfig(projectDir: string, opts?: ExpoConfigOptions): ExpoConfig;
16
+ export declare function ensureExpoConfigExists(projectDir: string): void;
13
17
  export declare function getPublicExpoConfig(projectDir: string, opts?: ExpoConfigOptions): PublicExpoConfig;
@@ -1,7 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getPublicExpoConfig = exports.getPrivateExpoConfig = void 0;
3
+ exports.getPublicExpoConfig = exports.ensureExpoConfigExists = exports.getPrivateExpoConfig = exports.createOrModifyExpoConfigAsync = void 0;
4
+ const tslib_1 = require("tslib");
4
5
  const config_1 = require("@expo/config");
6
+ const json_file_1 = tslib_1.__importDefault(require("@expo/json-file"));
7
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
8
+ const joi_1 = tslib_1.__importDefault(require("joi"));
9
+ const path_1 = tslib_1.__importDefault(require("path"));
10
+ async function createOrModifyExpoConfigAsync(projectDir, exp, readOptions) {
11
+ ensureExpoConfigExists(projectDir);
12
+ await ensureStaticExpoConfigIsValidAsync(projectDir);
13
+ if (readOptions) {
14
+ return (0, config_1.modifyConfigAsync)(projectDir, exp, readOptions);
15
+ }
16
+ else {
17
+ return (0, config_1.modifyConfigAsync)(projectDir, exp);
18
+ }
19
+ }
20
+ exports.createOrModifyExpoConfigAsync = createOrModifyExpoConfigAsync;
5
21
  function getExpoConfigInternal(projectDir, opts = {}) {
6
22
  const originalProcessEnv = process.env;
7
23
  try {
@@ -13,17 +29,58 @@ function getExpoConfigInternal(projectDir, opts = {}) {
13
29
  skipSDKVersionRequirement: true,
14
30
  ...(opts.isPublicConfig ? { isPublicConfig: true } : {}),
15
31
  });
32
+ const { error } = MinimalAppConfigSchema.validate(exp, {
33
+ allowUnknown: true,
34
+ abortEarly: true,
35
+ });
36
+ if (error) {
37
+ throw new Error(`Invalid app config.\n${error.message}`);
38
+ }
16
39
  return exp;
17
40
  }
18
41
  finally {
19
42
  process.env = originalProcessEnv;
20
43
  }
21
44
  }
45
+ const MinimalAppConfigSchema = joi_1.default.object({
46
+ slug: joi_1.default.string().required(),
47
+ name: joi_1.default.string().required(),
48
+ version: joi_1.default.string(),
49
+ android: joi_1.default.object({
50
+ versionCode: joi_1.default.number().integer(),
51
+ }),
52
+ ios: joi_1.default.object({
53
+ buildNumber: joi_1.default.string(),
54
+ }),
55
+ });
22
56
  function getPrivateExpoConfig(projectDir, opts = {}) {
57
+ ensureExpoConfigExists(projectDir);
23
58
  return getExpoConfigInternal(projectDir, { ...opts, isPublicConfig: false });
24
59
  }
25
60
  exports.getPrivateExpoConfig = getPrivateExpoConfig;
61
+ function ensureExpoConfigExists(projectDir) {
62
+ const paths = (0, config_1.getConfigFilePaths)(projectDir);
63
+ if (!(paths === null || paths === void 0 ? void 0 : paths.staticConfigPath) && !(paths === null || paths === void 0 ? void 0 : paths.dynamicConfigPath)) {
64
+ // eslint-disable-next-line node/no-sync
65
+ fs_extra_1.default.writeFileSync(path_1.default.join(projectDir, 'app.json'), JSON.stringify({ expo: {} }, null, 2));
66
+ }
67
+ }
68
+ exports.ensureExpoConfigExists = ensureExpoConfigExists;
69
+ async function ensureStaticExpoConfigIsValidAsync(projectDir) {
70
+ var _a;
71
+ const paths = (0, config_1.getConfigFilePaths)(projectDir);
72
+ if (((_a = paths === null || paths === void 0 ? void 0 : paths.staticConfigPath) === null || _a === void 0 ? void 0 : _a.endsWith('app.json')) && !(paths === null || paths === void 0 ? void 0 : paths.dynamicConfigPath)) {
73
+ const staticConfig = await json_file_1.default.readAsync(paths.staticConfigPath);
74
+ // Add the "expo" key if it doesn't exist on app.json yet, such as in
75
+ // projects initialized with RNC CLI
76
+ if (!(staticConfig === null || staticConfig === void 0 ? void 0 : staticConfig.expo)) {
77
+ staticConfig.expo = {};
78
+ await json_file_1.default.writeAsync(paths.staticConfigPath, staticConfig);
79
+ }
80
+ }
81
+ }
26
82
  function getPublicExpoConfig(projectDir, opts = {}) {
83
+ ensureExpoConfigExists(projectDir);
27
84
  return getExpoConfigInternal(projectDir, { ...opts, isPublicConfig: true });
28
85
  }
29
86
  exports.getPublicExpoConfig = getPublicExpoConfig;
@@ -13,7 +13,9 @@ export declare const toAppPrivacy: (privacy: ExpoConfig['privacy']) => AppPrivac
13
13
  */
14
14
  export declare function getProjectConfigDescription(projectDir: string): string;
15
15
  export declare function isExpoUpdatesInstalled(projectDir: string): boolean;
16
+ export declare function isExpoUpdatesInstalledAsDevDependency(projectDir: string): boolean;
16
17
  export declare function isExpoUpdatesInstalledOrAvailable(projectDir: string, sdkVersion?: string): boolean;
18
+ export declare function isUsingEASUpdate(exp: ExpoConfig, projectId: string): boolean;
17
19
  export declare function validateAppVersionRuntimePolicySupportAsync(projectDir: string, exp: ExpoConfig): Promise<void>;
18
20
  export declare function installExpoUpdatesAsync(projectDir: string, options?: {
19
21
  silent: boolean;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDisplayNameForProjectIdAsync = exports.getOwnerAccountForProjectIdAsync = exports.installExpoUpdatesAsync = exports.validateAppVersionRuntimePolicySupportAsync = exports.isExpoUpdatesInstalledOrAvailable = exports.isExpoUpdatesInstalled = exports.getProjectConfigDescription = exports.toAppPrivacy = exports.getUsername = void 0;
3
+ exports.getDisplayNameForProjectIdAsync = exports.getOwnerAccountForProjectIdAsync = exports.installExpoUpdatesAsync = exports.validateAppVersionRuntimePolicySupportAsync = exports.isUsingEASUpdate = exports.isExpoUpdatesInstalledOrAvailable = exports.isExpoUpdatesInstalledAsDevDependency = exports.isExpoUpdatesInstalled = exports.getProjectConfigDescription = exports.toAppPrivacy = exports.getUsername = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const config_1 = require("@expo/config");
6
6
  const chalk_1 = tslib_1.__importDefault(require("chalk"));
@@ -8,6 +8,7 @@ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
8
8
  const path_1 = tslib_1.__importDefault(require("path"));
9
9
  const resolve_from_1 = tslib_1.__importDefault(require("resolve-from"));
10
10
  const semver_1 = tslib_1.__importDefault(require("semver"));
11
+ const api_1 = require("../api");
11
12
  const generated_1 = require("../graphql/generated");
12
13
  const AppQuery_1 = require("../graphql/queries/AppQuery");
13
14
  const log_1 = tslib_1.__importDefault(require("../log"));
@@ -16,6 +17,8 @@ function getUsername(exp, user) {
16
17
  switch (user.__typename) {
17
18
  case 'User':
18
19
  return user.username;
20
+ case 'SSOUser':
21
+ return user.username;
19
22
  case 'Robot':
20
23
  // owner field is necessary to run `expo prebuild`
21
24
  if (!exp.owner) {
@@ -23,8 +26,6 @@ function getUsername(exp, user) {
23
26
  }
24
27
  // robot users don't have usernames
25
28
  return undefined;
26
- case 'SSOUser':
27
- throw new Error('SSO users are not supported yet.');
28
29
  }
29
30
  }
30
31
  exports.getUsername = getUsername;
@@ -67,6 +68,11 @@ function isExpoUpdatesInstalled(projectDir) {
67
68
  return !!(packageJson.dependencies && 'expo-updates' in packageJson.dependencies);
68
69
  }
69
70
  exports.isExpoUpdatesInstalled = isExpoUpdatesInstalled;
71
+ function isExpoUpdatesInstalledAsDevDependency(projectDir) {
72
+ const packageJson = (0, config_1.getPackageJson)(projectDir);
73
+ return !!(packageJson.devDependencies && 'expo-updates' in packageJson.devDependencies);
74
+ }
75
+ exports.isExpoUpdatesInstalledAsDevDependency = isExpoUpdatesInstalledAsDevDependency;
70
76
  function isExpoUpdatesInstalledOrAvailable(projectDir, sdkVersion) {
71
77
  // before sdk 44, expo-updates was included in with the expo module
72
78
  if (sdkVersion && semver_1.default.lt(sdkVersion, '44.0.0')) {
@@ -75,6 +81,11 @@ function isExpoUpdatesInstalledOrAvailable(projectDir, sdkVersion) {
75
81
  return isExpoUpdatesInstalled(projectDir);
76
82
  }
77
83
  exports.isExpoUpdatesInstalledOrAvailable = isExpoUpdatesInstalledOrAvailable;
84
+ function isUsingEASUpdate(exp, projectId) {
85
+ var _a;
86
+ return ((_a = exp.updates) === null || _a === void 0 ? void 0 : _a.url) === (0, api_1.getEASUpdateURL)(projectId);
87
+ }
88
+ exports.isUsingEASUpdate = isUsingEASUpdate;
78
89
  async function validateAppVersionRuntimePolicySupportAsync(projectDir, exp) {
79
90
  var _a;
80
91
  if (typeof exp.runtimeVersion !== 'object' || ((_a = exp.runtimeVersion) === null || _a === void 0 ? void 0 : _a.policy) !== 'appVersion') {
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ensureEASUpdateIsConfiguredAsync = exports.ensureEASUpdateIsConfiguredInEasJsonAsync = exports.DEFAULT_BARE_RUNTIME_VERSION = exports.DEFAULT_MANAGED_RUNTIME_VERSION = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const config_1 = require("@expo/config");
6
5
  const eas_build_job_1 = require("@expo/eas-build-job");
7
6
  const eas_json_1 = require("@expo/eas-json");
8
7
  const chalk_1 = tslib_1.__importDefault(require("chalk"));
@@ -11,6 +10,7 @@ const api_1 = require("../api");
11
10
  const generated_1 = require("../graphql/generated");
12
11
  const log_1 = tslib_1.__importStar(require("../log"));
13
12
  const platform_1 = require("../platform");
13
+ const expoConfig_1 = require("../project/expoConfig");
14
14
  const projectUtils_1 = require("../project/projectUtils");
15
15
  const workflow_1 = require("../project/workflow");
16
16
  const UpdatesModule_1 = require("./android/UpdatesModule");
@@ -100,7 +100,7 @@ async function ensureEASUpdatesIsConfiguredInExpoConfigAsync({ exp, projectId, p
100
100
  return { exp, projectChanged: false };
101
101
  }
102
102
  const mergedExp = mergeExpoConfig(exp, modifyConfig);
103
- const result = await (0, config_1.modifyConfigAsync)(projectDir, mergedExp);
103
+ const result = await (0, expoConfig_1.createOrModifyExpoConfigAsync)(projectDir, mergedExp);
104
104
  switch (result.type) {
105
105
  case 'success':
106
106
  logEasUpdatesAutoConfig({ exp, modifyConfig });
@@ -162,7 +162,7 @@ async function ensureEASUpdateIsConfiguredNativelyAsync(graphqlClient, { exp, pr
162
162
  async function ensureEASUpdateIsConfiguredInEasJsonAsync(projectDir) {
163
163
  const easJsonPath = eas_json_1.EasJsonAccessor.formatEasJsonPath(projectDir);
164
164
  if (!(await fs_extra_1.default.pathExists(easJsonPath))) {
165
- log_1.default.warn(`EAS Build is not configured. If you'd like to use EAS Build with EAS Update, run ${chalk_1.default.bold('eas build:configure')}, then re-run ${chalk_1.default.bold('eas update:configure')} to configure ${chalk_1.default.bold('eas.json')} with EAS Update.`);
165
+ log_1.default.warn(`EAS Build is not configured. If you'd like to use EAS Build with EAS Update, run ${chalk_1.default.bold('eas build:configure')}.`);
166
166
  return;
167
167
  }
168
168
  try {
@@ -212,9 +212,13 @@ exports.ensureEASUpdateIsConfiguredInEasJsonAsync = ensureEASUpdateIsConfiguredI
212
212
  */
213
213
  async function ensureEASUpdateIsConfiguredAsync(graphqlClient, { exp: expWithoutUpdates, projectId, projectDir, platform, }) {
214
214
  const hasExpoUpdates = (0, projectUtils_1.isExpoUpdatesInstalledOrAvailable)(projectDir, expWithoutUpdates.sdkVersion);
215
- if (!hasExpoUpdates) {
215
+ const hasExpoUpdatesInDevDependencies = (0, projectUtils_1.isExpoUpdatesInstalledAsDevDependency)(projectDir);
216
+ if (!hasExpoUpdates && !hasExpoUpdatesInDevDependencies) {
216
217
  await (0, projectUtils_1.installExpoUpdatesAsync)(projectDir, { silent: false });
217
- log_1.default.withTick('Installed expo updates');
218
+ log_1.default.withTick('Installed expo-updates');
219
+ }
220
+ else if (hasExpoUpdatesInDevDependencies) {
221
+ log_1.default.warn(`The "expo-updates" package is installed as a dev dependency. This is not recommended. Move "expo-updates" to your main dependencies.`);
218
222
  }
219
223
  // Bail out if using a platform that doesn't require runtime versions
220
224
  // or native setup, i.e. web.
@@ -39,10 +39,12 @@ export default class SessionManager {
39
39
  *
40
40
  * @deprecated Should not be used outside of context functions, except in the AccountLogin command.
41
41
  */
42
- showLoginPromptAsync({ nonInteractive, printNewLine, }?: {
42
+ showLoginPromptAsync({ nonInteractive, printNewLine, sso, }?: {
43
43
  nonInteractive?: boolean | undefined;
44
44
  printNewLine?: boolean | undefined;
45
+ sso?: boolean | undefined;
45
46
  }): Promise<void>;
47
+ private ssoLoginAsync;
46
48
  private loginAsync;
47
49
  /**
48
50
  * Prompt for an OTP with the option to cancel the question by answering empty (pressing return key).
@@ -14,6 +14,7 @@ const UserQuery_1 = require("../graphql/queries/UserQuery");
14
14
  const log_1 = tslib_1.__importStar(require("../log"));
15
15
  const prompts_1 = require("../prompts");
16
16
  const paths_1 = require("../utils/paths");
17
+ const fetchSessionSecretAndSsoUser_1 = require("./fetchSessionSecretAndSsoUser");
17
18
  const fetchSessionSecretAndUser_1 = require("./fetchSessionSecretAndUser");
18
19
  var UserSecondFactorDeviceMethod;
19
20
  (function (UserSecondFactorDeviceMethod) {
@@ -102,14 +103,18 @@ class SessionManager {
102
103
  *
103
104
  * @deprecated Should not be used outside of context functions, except in the AccountLogin command.
104
105
  */
105
- async showLoginPromptAsync({ nonInteractive = false, printNewLine = false, } = {}) {
106
+ async showLoginPromptAsync({ nonInteractive = false, printNewLine = false, sso = false, } = {}) {
106
107
  if (nonInteractive) {
107
108
  core_1.Errors.error(`Either log in with ${chalk_1.default.bold('eas login')} or set the ${chalk_1.default.bold('EXPO_TOKEN')} environment variable if you're using EAS CLI on CI (${(0, log_1.learnMore)('https://docs.expo.dev/accounts/programmatic-access/', { dim: false })})`);
108
109
  }
109
110
  if (printNewLine) {
110
111
  log_1.default.newLine();
111
112
  }
112
- log_1.default.log('Log in to EAS');
113
+ if (sso) {
114
+ await this.ssoLoginAsync();
115
+ return;
116
+ }
117
+ log_1.default.log(`Log in to EAS with email or username (exit and run ${chalk_1.default.bold('eas login')} for other options)`);
113
118
  const { username, password } = await (0, prompts_1.promptAsync)([
114
119
  {
115
120
  type: 'text',
@@ -137,6 +142,15 @@ class SessionManager {
137
142
  }
138
143
  }
139
144
  }
145
+ async ssoLoginAsync() {
146
+ const { sessionSecret, id, username } = await (0, fetchSessionSecretAndSsoUser_1.fetchSessionSecretAndSsoUserAsync)();
147
+ await this.setSessionAsync({
148
+ sessionSecret,
149
+ userId: id,
150
+ username,
151
+ currentConnection: 'Browser-Flow-Authentication',
152
+ });
153
+ }
140
154
  async loginAsync(input) {
141
155
  const { sessionSecret, id, username } = await (0, fetchSessionSecretAndUser_1.fetchSessionSecretAndUserAsync)(input);
142
156
  await this.setSessionAsync({
@@ -1,7 +1,7 @@
1
1
  import { CurrentUserQuery, Robot, SsoUser, User } from '../graphql/generated';
2
2
  export type Actor = NonNullable<CurrentUserQuery['meActor']>;
3
3
  /**
4
- * Resolve the name of the actor, either normal user or robot user.
4
+ * Resolve the name of the actor, either normal user, sso user or robot user.
5
5
  * This should be used whenever the "current user" needs to be displayed.
6
6
  * The display name CANNOT be used as project owner.
7
7
  */
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getActorUsername = exports.getActorDisplayName = void 0;
4
4
  /**
5
- * Resolve the name of the actor, either normal user or robot user.
5
+ * Resolve the name of the actor, either normal user, sso user or robot user.
6
6
  * This should be used whenever the "current user" needs to be displayed.
7
7
  * The display name CANNOT be used as project owner.
8
8
  */
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ensureActorHasPrimaryAccount = void 0;
4
4
  function ensureActorHasPrimaryAccount(user) {
5
- if (user.__typename === 'User') {
5
+ if (user.__typename === 'User' || user.__typename === 'SSOUser') {
6
6
  return user.primaryAccount;
7
7
  }
8
8
  throw new Error('This action is not supported for robot users.');
@@ -0,0 +1,4 @@
1
+ export declare function getSessionUsingBrowserAuthFlowAsync(options: {
2
+ expoWebsiteUrl: string;
3
+ serverPort: number;
4
+ }): Promise<string>;