eas-cli 3.13.0 → 3.13.2

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 (151) hide show
  1. package/README.md +68 -67
  2. package/build/build/build.js +9 -1
  3. package/build/build/createContext.d.ts +2 -2
  4. package/build/build/createContext.js +2 -2
  5. package/build/build/errors.d.ts +2 -0
  6. package/build/build/errors.js +4 -1
  7. package/build/build/ios/version.js +11 -2
  8. package/build/build/runBuildAndSubmit.d.ts +1 -1
  9. package/build/build/runBuildAndSubmit.js +6 -5
  10. package/build/build/types.d.ts +1 -0
  11. package/build/build/types.js +1 -0
  12. package/build/build/utils/formatBuild.js +2 -0
  13. package/build/build/utils/printBuildInfo.js +1 -1
  14. package/build/commandUtils/EasCommand.d.ts +7 -6
  15. package/build/commandUtils/EasCommand.js +7 -5
  16. package/build/commandUtils/context/DynamicProjectConfigContextField.d.ts +5 -2
  17. package/build/commandUtils/context/DynamicProjectConfigContextField.js +24 -5
  18. package/build/commandUtils/context/{OptionalProjectConfigContextField.d.ts → OptionalPrivateProjectConfigContextField.d.ts} +1 -1
  19. package/build/commandUtils/context/{OptionalProjectConfigContextField.js → OptionalPrivateProjectConfigContextField.js} +5 -5
  20. package/build/commandUtils/context/{ProjectConfigContextField.d.ts → PrivateProjectConfigContextField.d.ts} +1 -1
  21. package/build/commandUtils/context/{ProjectConfigContextField.js → PrivateProjectConfigContextField.js} +5 -4
  22. package/build/commandUtils/context/contextUtils/getProjectIdAsync.js +1 -1
  23. package/build/commands/branch/create.d.ts +1 -1
  24. package/build/commands/branch/create.js +1 -1
  25. package/build/commands/branch/delete.d.ts +1 -1
  26. package/build/commands/branch/delete.js +1 -1
  27. package/build/commands/branch/list.d.ts +1 -1
  28. package/build/commands/branch/list.js +1 -1
  29. package/build/commands/branch/rename.d.ts +1 -1
  30. package/build/commands/branch/rename.js +1 -1
  31. package/build/commands/branch/view.d.ts +1 -1
  32. package/build/commands/branch/view.js +1 -1
  33. package/build/commands/build/cancel.d.ts +1 -1
  34. package/build/commands/build/cancel.js +2 -2
  35. package/build/commands/build/configure.d.ts +1 -1
  36. package/build/commands/build/configure.js +1 -1
  37. package/build/commands/build/index.d.ts +2 -1
  38. package/build/commands/build/index.js +2 -2
  39. package/build/commands/build/inspect.d.ts +2 -1
  40. package/build/commands/build/inspect.js +2 -2
  41. package/build/commands/build/internal.d.ts +2 -1
  42. package/build/commands/build/internal.js +2 -2
  43. package/build/commands/build/list.d.ts +1 -1
  44. package/build/commands/build/list.js +5 -1
  45. package/build/commands/build/resign.d.ts +2 -1
  46. package/build/commands/build/resign.js +2 -2
  47. package/build/commands/build/run.d.ts +1 -1
  48. package/build/commands/build/run.js +1 -1
  49. package/build/commands/build/version/get.d.ts +2 -1
  50. package/build/commands/build/version/get.js +2 -2
  51. package/build/commands/build/version/set.d.ts +2 -1
  52. package/build/commands/build/version/set.js +2 -2
  53. package/build/commands/build/version/sync.d.ts +2 -1
  54. package/build/commands/build/version/sync.js +2 -2
  55. package/build/commands/build/view.d.ts +1 -1
  56. package/build/commands/build/view.js +1 -1
  57. package/build/commands/channel/create.d.ts +1 -1
  58. package/build/commands/channel/create.js +1 -1
  59. package/build/commands/channel/delete.d.ts +1 -1
  60. package/build/commands/channel/delete.js +1 -1
  61. package/build/commands/channel/edit.d.ts +1 -1
  62. package/build/commands/channel/edit.js +1 -1
  63. package/build/commands/channel/list.d.ts +1 -1
  64. package/build/commands/channel/list.js +1 -1
  65. package/build/commands/channel/rollout.d.ts +1 -1
  66. package/build/commands/channel/rollout.js +1 -1
  67. package/build/commands/channel/view.d.ts +1 -1
  68. package/build/commands/channel/view.js +1 -1
  69. package/build/commands/config.d.ts +2 -1
  70. package/build/commands/config.js +2 -3
  71. package/build/commands/credentials.d.ts +3 -2
  72. package/build/commands/credentials.js +2 -2
  73. package/build/commands/device/create.d.ts +1 -1
  74. package/build/commands/device/create.js +2 -2
  75. package/build/commands/device/delete.d.ts +1 -1
  76. package/build/commands/device/delete.js +1 -1
  77. package/build/commands/device/list.d.ts +1 -1
  78. package/build/commands/device/list.js +1 -1
  79. package/build/commands/device/rename.d.ts +1 -1
  80. package/build/commands/device/rename.js +1 -1
  81. package/build/commands/device/view.d.ts +1 -1
  82. package/build/commands/device/view.js +1 -1
  83. package/build/commands/metadata/pull.d.ts +1 -1
  84. package/build/commands/metadata/pull.js +1 -1
  85. package/build/commands/metadata/push.d.ts +1 -1
  86. package/build/commands/metadata/push.js +1 -1
  87. package/build/commands/open.d.ts +1 -1
  88. package/build/commands/open.js +1 -1
  89. package/build/commands/project/info.d.ts +1 -1
  90. package/build/commands/project/info.js +1 -1
  91. package/build/commands/project/init.js +3 -3
  92. package/build/commands/secret/create.d.ts +1 -1
  93. package/build/commands/secret/create.js +1 -1
  94. package/build/commands/secret/delete.d.ts +1 -1
  95. package/build/commands/secret/delete.js +1 -1
  96. package/build/commands/secret/list.d.ts +1 -1
  97. package/build/commands/secret/list.js +1 -1
  98. package/build/commands/secret/push.d.ts +1 -1
  99. package/build/commands/secret/push.js +1 -1
  100. package/build/commands/submit.d.ts +1 -1
  101. package/build/commands/submit.js +1 -1
  102. package/build/commands/update/configure.d.ts +1 -1
  103. package/build/commands/update/configure.js +1 -1
  104. package/build/commands/update/index.d.ts +2 -1
  105. package/build/commands/update/index.js +4 -8
  106. package/build/commands/update/list.d.ts +1 -1
  107. package/build/commands/update/list.js +1 -1
  108. package/build/commands/update/republish.d.ts +1 -1
  109. package/build/commands/update/republish.js +1 -1
  110. package/build/commands/update/roll-back-to-embedded.d.ts +2 -1
  111. package/build/commands/update/roll-back-to-embedded.js +4 -8
  112. package/build/commands/webhook/create.d.ts +1 -1
  113. package/build/commands/webhook/create.js +1 -1
  114. package/build/commands/webhook/delete.d.ts +1 -1
  115. package/build/commands/webhook/delete.js +1 -1
  116. package/build/commands/webhook/list.d.ts +1 -1
  117. package/build/commands/webhook/list.js +1 -1
  118. package/build/credentials/context.d.ts +0 -3
  119. package/build/credentials/context.js +1 -10
  120. package/build/credentials/ios/actions/DeviceUtils.js +1 -0
  121. package/build/credentials/ios/actions/SetUpAscApiKey.js +3 -3
  122. package/build/credentials/manager/HelperActions.d.ts +1 -1
  123. package/build/credentials/manager/ManageAndroid.js +1 -1
  124. package/build/credentials/manager/ManageIos.js +1 -1
  125. package/build/credentials/manager/SelectPlatform.d.ts +2 -2
  126. package/build/credentials/manager/SelectPlatform.js +2 -2
  127. package/build/easMultiselect.d.ts +24 -0
  128. package/build/easMultiselect.js +46 -0
  129. package/build/graphql/generated.d.ts +61 -10
  130. package/build/graphql/generated.js +2 -0
  131. package/build/graphql/types/Update.js +1 -1
  132. package/build/project/expoConfig.d.ts +7 -2
  133. package/build/project/expoConfig.js +10 -3
  134. package/build/prompts.d.ts +2 -1
  135. package/build/prompts.js +5 -1
  136. package/build/submit/ios/AscApiKeySource.d.ts +7 -2
  137. package/build/submit/ios/AscApiKeySource.js +63 -1
  138. package/build/submit/ios/IosSubmitCommand.d.ts +0 -1
  139. package/build/submit/ios/IosSubmitCommand.js +4 -49
  140. package/build/submit/ios/IosSubmitter.d.ts +0 -2
  141. package/build/submit/ios/IosSubmitter.js +1 -6
  142. package/build/update/utils.d.ts +2 -2
  143. package/build/update/utils.js +4 -2
  144. package/build/user/User.d.ts +2 -2
  145. package/build/user/User.js +5 -4
  146. package/oclif.manifest.json +1 -1
  147. package/package.json +2 -2
  148. package/build/credentials/ios/actions/SetUpSubmissionCredentials.d.ts +0 -10
  149. package/build/credentials/ios/actions/SetUpSubmissionCredentials.js +0 -53
  150. package/build/submit/ios/CredentialsServiceSource.d.ts +0 -18
  151. package/build/submit/ios/CredentialsServiceSource.js +0 -62
@@ -642,6 +642,8 @@ export type AndroidAppCredentialsMutation = {
642
642
  __typename?: 'AndroidAppCredentialsMutation';
643
643
  /** Create a set of credentials for an Android app */
644
644
  createAndroidAppCredentials: AndroidAppCredentials;
645
+ /** Delete a set of credentials for an Android app */
646
+ deleteAndroidAppCredentials: DeleteAndroidAppCredentialsResult;
645
647
  /** Set the FCM push key to be used in an Android app */
646
648
  setFcm: AndroidAppCredentials;
647
649
  /** Set the Google Service Account Key to be used for submitting an Android app */
@@ -652,6 +654,9 @@ export type AndroidAppCredentialsMutationCreateAndroidAppCredentialsArgs = {
652
654
  appId: Scalars['ID'];
653
655
  applicationIdentifier: Scalars['String'];
654
656
  };
657
+ export type AndroidAppCredentialsMutationDeleteAndroidAppCredentialsArgs = {
658
+ id: Scalars['ID'];
659
+ };
655
660
  export type AndroidAppCredentialsMutationSetFcmArgs = {
656
661
  fcmId: Scalars['ID'];
657
662
  id: Scalars['ID'];
@@ -869,6 +874,8 @@ export type App = Project & {
869
874
  /** @deprecated No longer supported */
870
875
  iconUrl?: Maybe<Scalars['String']>;
871
876
  id: Scalars['ID'];
877
+ /** App query field for querying EAS Insights about this app */
878
+ insights: AppInsights;
872
879
  /** iOS app credentials for the project */
873
880
  iosAppCredentials: Array<IosAppCredentials>;
874
881
  /** Whether the latest classic update publish is using a deprecated SDK version */
@@ -1139,6 +1146,21 @@ export type AppInput = {
1139
1146
  privacy: AppPrivacy;
1140
1147
  projectName: Scalars['String'];
1141
1148
  };
1149
+ export type AppInsights = {
1150
+ __typename?: 'AppInsights';
1151
+ totalUniqueUsers?: Maybe<Scalars['Int']>;
1152
+ uniqueUsersByAppVersionOverTime: UniqueUsersOverTimeData;
1153
+ uniqueUsersByPlatformOverTime: UniqueUsersOverTimeData;
1154
+ };
1155
+ export type AppInsightsTotalUniqueUsersArgs = {
1156
+ timespan: InsightsTimespan;
1157
+ };
1158
+ export type AppInsightsUniqueUsersByAppVersionOverTimeArgs = {
1159
+ timespan: InsightsTimespan;
1160
+ };
1161
+ export type AppInsightsUniqueUsersByPlatformOverTimeArgs = {
1162
+ timespan: InsightsTimespan;
1163
+ };
1142
1164
  export type AppMutation = {
1143
1165
  __typename?: 'AppMutation';
1144
1166
  /** Create an unpublished app */
@@ -1646,6 +1668,7 @@ export type Build = ActivityTimelineProjectActivity & BuildOrBuildJob & {
1646
1668
  __typename?: 'Build';
1647
1669
  activityTimestamp: Scalars['DateTime'];
1648
1670
  actor?: Maybe<Actor>;
1671
+ app: App;
1649
1672
  appBuildVersion?: Maybe<Scalars['String']>;
1650
1673
  appVersion?: Maybe<Scalars['String']>;
1651
1674
  artifacts?: Maybe<BuildArtifacts>;
@@ -2031,7 +2054,8 @@ export declare enum BuildStatus {
2031
2054
  Finished = "FINISHED",
2032
2055
  InProgress = "IN_PROGRESS",
2033
2056
  InQueue = "IN_QUEUE",
2034
- New = "NEW"
2057
+ New = "NEW",
2058
+ PendingCancel = "PENDING_CANCEL"
2035
2059
  }
2036
2060
  export declare enum BuildTrigger {
2037
2061
  EasCli = "EAS_CLI",
@@ -2155,6 +2179,10 @@ export type DeleteAccountSsoConfigurationResult = {
2155
2179
  __typename?: 'DeleteAccountSSOConfigurationResult';
2156
2180
  id: Scalars['ID'];
2157
2181
  };
2182
+ export type DeleteAndroidAppCredentialsResult = {
2183
+ __typename?: 'DeleteAndroidAppCredentialsResult';
2184
+ id: Scalars['ID'];
2185
+ };
2158
2186
  export type DeleteAndroidKeystoreResult = {
2159
2187
  __typename?: 'DeleteAndroidKeystoreResult';
2160
2188
  id: Scalars['ID'];
@@ -2640,6 +2668,10 @@ export type GoogleServiceAccountKeyMutationCreateGoogleServiceAccountKeyArgs = {
2640
2668
  export type GoogleServiceAccountKeyMutationDeleteGoogleServiceAccountKeyArgs = {
2641
2669
  id: Scalars['ID'];
2642
2670
  };
2671
+ export type InsightsTimespan = {
2672
+ end: Scalars['DateTime'];
2673
+ start: Scalars['DateTime'];
2674
+ };
2643
2675
  export type Invoice = {
2644
2676
  __typename?: 'Invoice';
2645
2677
  /** The total amount due for the invoice, in cents */
@@ -2800,13 +2832,6 @@ export type IosAppCredentialsMutationSetPushKeyArgs = {
2800
2832
  id: Scalars['ID'];
2801
2833
  pushKeyId: Scalars['ID'];
2802
2834
  };
2803
- export type IosAppCredentialsQuery = {
2804
- __typename?: 'IosAppCredentialsQuery';
2805
- byId: IosAppCredentials;
2806
- };
2807
- export type IosAppCredentialsQueryByIdArgs = {
2808
- iosAppCredentialsId: Scalars['ID'];
2809
- };
2810
2835
  /** @deprecated Use developmentClient option instead. */
2811
2836
  export declare enum IosBuildType {
2812
2837
  DevelopmentClient = "DEVELOPMENT_CLIENT",
@@ -2936,6 +2961,17 @@ export type LeaveAccountResult = {
2936
2961
  __typename?: 'LeaveAccountResult';
2937
2962
  success: Scalars['Boolean'];
2938
2963
  };
2964
+ export type LineChartData = {
2965
+ __typename?: 'LineChartData';
2966
+ datasets: Array<LineDataset>;
2967
+ labels: Array<Scalars['String']>;
2968
+ };
2969
+ export type LineDataset = {
2970
+ __typename?: 'LineDataset';
2971
+ data: Array<Maybe<Scalars['Int']>>;
2972
+ id: Scalars['ID'];
2973
+ label: Scalars['String'];
2974
+ };
2939
2975
  export declare enum MailchimpAudience {
2940
2976
  ExpoDevelopers = "EXPO_DEVELOPERS"
2941
2977
  }
@@ -3049,6 +3085,7 @@ export type MeteredBillingStatus = {
3049
3085
  };
3050
3086
  export declare enum NotificationEvent {
3051
3087
  BuildComplete = "BUILD_COMPLETE",
3088
+ BuildPlanCreditThresholdExceeded = "BUILD_PLAN_CREDIT_THRESHOLD_EXCEEDED",
3052
3089
  SubmissionComplete = "SUBMISSION_COMPLETE"
3053
3090
  }
3054
3091
  export type NotificationSubscription = {
@@ -3413,8 +3450,6 @@ export type RootQuery = {
3413
3450
  githubApp: GitHubAppQuery;
3414
3451
  /** Top-level query object for querying Stripe Invoices. */
3415
3452
  invoice: InvoiceQuery;
3416
- /** Top-level query object for querying IosAppCredentials. */
3417
- iosAppCredentials: IosAppCredentialsQuery;
3418
3453
  /**
3419
3454
  * If authenticated as a typical end user, this is the appropriate top-level
3420
3455
  * query object
@@ -3906,6 +3941,10 @@ export type TimelineActivityFilterInput = {
3906
3941
  releaseChannels?: InputMaybe<Array<Scalars['String']>>;
3907
3942
  types?: InputMaybe<Array<ActivityTimelineProjectActivityType>>;
3908
3943
  };
3944
+ export type UniqueUsersOverTimeData = {
3945
+ __typename?: 'UniqueUsersOverTimeData';
3946
+ data: LineChartData;
3947
+ };
3909
3948
  export type UnsubscribeFromNotificationResult = {
3910
3949
  __typename?: 'UnsubscribeFromNotificationResult';
3911
3950
  notificationSubscription: NotificationSubscription;
@@ -3914,6 +3953,7 @@ export type Update = ActivityTimelineProjectActivity & {
3914
3953
  __typename?: 'Update';
3915
3954
  activityTimestamp: Scalars['DateTime'];
3916
3955
  actor?: Maybe<Actor>;
3956
+ app: App;
3917
3957
  awaitingCodeSigningInfo: Scalars['Boolean'];
3918
3958
  branch: UpdateBranch;
3919
3959
  branchId: Scalars['ID'];
@@ -4055,6 +4095,7 @@ export type UpdateRollBackToEmbeddedGroup = {
4055
4095
  export type UpdatesFilter = {
4056
4096
  platform?: InputMaybe<AppPlatform>;
4057
4097
  runtimeVersions?: InputMaybe<Array<Scalars['String']>>;
4098
+ sdkVersions?: InputMaybe<Array<Scalars['String']>>;
4058
4099
  };
4059
4100
  export type UploadSession = {
4060
4101
  __typename?: 'UploadSession';
@@ -7862,6 +7903,7 @@ export type UpdatePublishMutation = {
7862
7903
  id: string;
7863
7904
  } | {
7864
7905
  __typename: 'SSOUser';
7906
+ username: string;
7865
7907
  id: string;
7866
7908
  } | {
7867
7909
  __typename: 'User';
@@ -8203,6 +8245,7 @@ export type BranchesByAppQuery = {
8203
8245
  id: string;
8204
8246
  } | {
8205
8247
  __typename: 'SSOUser';
8248
+ username: string;
8206
8249
  id: string;
8207
8250
  } | {
8208
8251
  __typename: 'User';
@@ -8263,6 +8306,7 @@ export type ViewBranchesOnUpdateChannelQuery = {
8263
8306
  id: string;
8264
8307
  } | {
8265
8308
  __typename: 'SSOUser';
8309
+ username: string;
8266
8310
  id: string;
8267
8311
  } | {
8268
8312
  __typename: 'User';
@@ -8597,6 +8641,7 @@ export type ViewUpdateChannelOnAppQuery = {
8597
8641
  id: string;
8598
8642
  } | {
8599
8643
  __typename: 'SSOUser';
8644
+ username: string;
8600
8645
  id: string;
8601
8646
  } | {
8602
8647
  __typename: 'User';
@@ -8659,6 +8704,7 @@ export type ViewUpdateChannelsOnAppQuery = {
8659
8704
  id: string;
8660
8705
  } | {
8661
8706
  __typename: 'SSOUser';
8707
+ username: string;
8662
8708
  id: string;
8663
8709
  } | {
8664
8710
  __typename: 'User';
@@ -8881,6 +8927,7 @@ export type ViewUpdatesByGroupQuery = {
8881
8927
  id: string;
8882
8928
  } | {
8883
8929
  __typename: 'SSOUser';
8930
+ username: string;
8884
8931
  id: string;
8885
8932
  } | {
8886
8933
  __typename: 'User';
@@ -8935,6 +8982,7 @@ export type ViewUpdateGroupsOnBranchQuery = {
8935
8982
  id: string;
8936
8983
  } | {
8937
8984
  __typename: 'SSOUser';
8985
+ username: string;
8938
8986
  id: string;
8939
8987
  } | {
8940
8988
  __typename: 'User';
@@ -8988,6 +9036,7 @@ export type ViewUpdateGroupsOnAppQuery = {
8988
9036
  id: string;
8989
9037
  } | {
8990
9038
  __typename: 'SSOUser';
9039
+ username: string;
8991
9040
  id: string;
8992
9041
  } | {
8993
9042
  __typename: 'User';
@@ -9436,6 +9485,7 @@ export type UpdateFragment = {
9436
9485
  id: string;
9437
9486
  } | {
9438
9487
  __typename: 'SSOUser';
9488
+ username: string;
9439
9489
  id: string;
9440
9490
  } | {
9441
9491
  __typename: 'User';
@@ -9476,6 +9526,7 @@ export type UpdateBranchFragment = {
9476
9526
  id: string;
9477
9527
  } | {
9478
9528
  __typename: 'SSOUser';
9529
+ username: string;
9479
9530
  id: string;
9480
9531
  } | {
9481
9532
  __typename: 'User';
@@ -170,6 +170,7 @@ var BuildStatus;
170
170
  BuildStatus["InProgress"] = "IN_PROGRESS";
171
171
  BuildStatus["InQueue"] = "IN_QUEUE";
172
172
  BuildStatus["New"] = "NEW";
173
+ BuildStatus["PendingCancel"] = "PENDING_CANCEL";
173
174
  })(BuildStatus = exports.BuildStatus || (exports.BuildStatus = {}));
174
175
  var BuildTrigger;
175
176
  (function (BuildTrigger) {
@@ -290,6 +291,7 @@ var MailchimpTag;
290
291
  var NotificationEvent;
291
292
  (function (NotificationEvent) {
292
293
  NotificationEvent["BuildComplete"] = "BUILD_COMPLETE";
294
+ NotificationEvent["BuildPlanCreditThresholdExceeded"] = "BUILD_PLAN_CREDIT_THRESHOLD_EXCEEDED";
293
295
  NotificationEvent["SubmissionComplete"] = "SUBMISSION_COMPLETE";
294
296
  })(NotificationEvent = exports.NotificationEvent || (exports.NotificationEvent = {}));
295
297
  var NotificationType;
@@ -18,7 +18,7 @@ exports.UpdateFragmentNode = (0, graphql_tag_1.default) `
18
18
  actor {
19
19
  __typename
20
20
  id
21
- ... on User {
21
+ ... on UserActor {
22
22
  username
23
23
  }
24
24
  ... on Robot {
@@ -1,8 +1,13 @@
1
1
  import { ExpoConfig } from '@expo/config';
2
2
  import { Env } from '@expo/eas-build-job';
3
+ export type PublicExpoConfig = Omit<ExpoConfig, '_internal' | 'hooks' | 'ios' | 'android' | 'updates'> & {
4
+ ios?: Omit<ExpoConfig['ios'], 'config'>;
5
+ android?: Omit<ExpoConfig['android'], 'config'>;
6
+ updates?: Omit<ExpoConfig['updates'], 'codeSigningCertificate' | 'codeSigningMetadata'>;
7
+ };
3
8
  export interface ExpoConfigOptions {
4
9
  env?: Env;
5
- isPublicConfig?: boolean;
6
10
  skipSDKVersionRequirement?: boolean;
7
11
  }
8
- export declare function getExpoConfig(projectDir: string, opts?: ExpoConfigOptions): ExpoConfig;
12
+ export declare function getPrivateExpoConfig(projectDir: string, opts?: ExpoConfigOptions): ExpoConfig;
13
+ export declare function getPublicExpoConfig(projectDir: string, opts?: ExpoConfigOptions): PublicExpoConfig;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getExpoConfig = void 0;
3
+ exports.getPublicExpoConfig = exports.getPrivateExpoConfig = void 0;
4
4
  const config_1 = require("@expo/config");
5
- function getExpoConfig(projectDir, opts = {}) {
5
+ function getExpoConfigInternal(projectDir, opts = {}) {
6
6
  const originalProcessEnv = process.env;
7
7
  try {
8
8
  process.env = {
@@ -19,4 +19,11 @@ function getExpoConfig(projectDir, opts = {}) {
19
19
  process.env = originalProcessEnv;
20
20
  }
21
21
  }
22
- exports.getExpoConfig = getExpoConfig;
22
+ function getPrivateExpoConfig(projectDir, opts = {}) {
23
+ return getExpoConfigInternal(projectDir, { ...opts, isPublicConfig: false });
24
+ }
25
+ exports.getPrivateExpoConfig = getPrivateExpoConfig;
26
+ function getPublicExpoConfig(projectDir, opts = {}) {
27
+ return getExpoConfigInternal(projectDir, { ...opts, isPublicConfig: true });
28
+ }
29
+ exports.getPublicExpoConfig = getPublicExpoConfig;
@@ -1,4 +1,5 @@
1
- import { Answers, Choice, Options, PromptType, PromptObject as Question } from 'prompts';
1
+ import { Answers, Choice, Options, PromptType } from 'prompts';
2
+ import { Question } from './easMultiselect';
2
3
  export { PromptType, Question, Choice };
3
4
  export interface ExpoChoice<T> extends Choice {
4
5
  value: T;
package/build/prompts.js CHANGED
@@ -3,7 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.pressAnyKeyToContinueAsync = exports.toggleConfirmAsync = exports.selectAsync = exports.confirmAsync = exports.promptAsync = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const os_1 = require("os");
6
- const prompts_1 = tslib_1.__importDefault(require("prompts"));
6
+ const prompts_1 = tslib_1.__importStar(require("prompts"));
7
+ const easMultiselect_1 = require("./easMultiselect");
8
+ if (prompts_1.prompts) {
9
+ prompts_1.prompts.multiselect = easMultiselect_1.easMultiselect;
10
+ }
7
11
  async function promptAsync(questions, options = {}) {
8
12
  var _a;
9
13
  if (!process.stdin.isTTY && !global.test) {
@@ -3,11 +3,15 @@ import { AscApiKeyPath, MinimalAscApiKey } from '../../credentials/ios/credentia
3
3
  import { SubmissionContext } from '../context';
4
4
  export declare enum AscApiKeySourceType {
5
5
  path = 0,
6
- prompt = 1
6
+ prompt = 1,
7
+ credentialsService = 2
7
8
  }
8
9
  interface AscApiKeySourceBase {
9
10
  sourceType: AscApiKeySourceType;
10
11
  }
12
+ interface AscApiKeyCredentialsServiceSource extends AscApiKeySourceBase {
13
+ sourceType: AscApiKeySourceType.credentialsService;
14
+ }
11
15
  interface AscApiKeyPromptSource extends AscApiKeySourceBase {
12
16
  sourceType: AscApiKeySourceType.prompt;
13
17
  }
@@ -15,7 +19,7 @@ interface AscApiKeyEnvVarSource extends AscApiKeySourceBase {
15
19
  sourceType: AscApiKeySourceType.path;
16
20
  path: AscApiKeyPath;
17
21
  }
18
- export type AscApiKeySource = AscApiKeyEnvVarSource | AscApiKeyPromptSource;
22
+ export type AscApiKeySource = AscApiKeyEnvVarSource | AscApiKeyPromptSource | AscApiKeyCredentialsServiceSource;
19
23
  type AscApiKeySummary = {
20
24
  source: 'local' | 'EAS servers';
21
25
  path?: string;
@@ -29,6 +33,7 @@ export type AscApiKeyResult = {
29
33
  result: MinimalAscApiKey | AscApiKeyFromExpoServers;
30
34
  summary: AscApiKeySummary;
31
35
  };
36
+ export declare function getAscApiKeyResultAsync(ctx: SubmissionContext<Platform.IOS>, source: AscApiKeySource): Promise<AscApiKeyResult>;
32
37
  export declare function getAscApiKeyLocallyAsync(ctx: SubmissionContext<Platform.IOS>, source: AscApiKeySource): Promise<AscApiKeyResult>;
33
38
  export declare function getAscApiKeyPathAsync(ctx: SubmissionContext<Platform.IOS>, source: AscApiKeySource): Promise<AscApiKeyPath>;
34
39
  export {};
@@ -1,16 +1,76 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAscApiKeyPathAsync = exports.getAscApiKeyLocallyAsync = exports.AscApiKeySourceType = void 0;
3
+ exports.getAscApiKeyPathAsync = exports.getAscApiKeyLocallyAsync = exports.getAscApiKeyResultAsync = exports.AscApiKeySourceType = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
6
+ const nullthrows_1 = tslib_1.__importDefault(require("nullthrows"));
6
7
  const AscApiKeyUtils_1 = require("../../credentials/ios/actions/AscApiKeyUtils");
8
+ const SetUpAscApiKey_1 = require("../../credentials/ios/actions/SetUpAscApiKey");
7
9
  const log_1 = tslib_1.__importDefault(require("../../log"));
10
+ const bundleIdentifier_1 = require("../../project/ios/bundleIdentifier");
11
+ const prompts_1 = require("../../prompts");
8
12
  const files_1 = require("../utils/files");
9
13
  var AscApiKeySourceType;
10
14
  (function (AscApiKeySourceType) {
11
15
  AscApiKeySourceType[AscApiKeySourceType["path"] = 0] = "path";
12
16
  AscApiKeySourceType[AscApiKeySourceType["prompt"] = 1] = "prompt";
17
+ AscApiKeySourceType[AscApiKeySourceType["credentialsService"] = 2] = "credentialsService";
13
18
  })(AscApiKeySourceType = exports.AscApiKeySourceType || (exports.AscApiKeySourceType = {}));
19
+ async function getAscApiKeyResultAsync(ctx, source) {
20
+ if (source.sourceType === AscApiKeySourceType.credentialsService) {
21
+ return await getAscApiKeyFromCredentialsServiceAsync(ctx);
22
+ }
23
+ else {
24
+ return await getAscApiKeyLocallyAsync(ctx, source);
25
+ }
26
+ }
27
+ exports.getAscApiKeyResultAsync = getAscApiKeyResultAsync;
28
+ async function maybeGetIosBundleIdentifierAsync(ctx) {
29
+ try {
30
+ return await (0, bundleIdentifier_1.getBundleIdentifierAsync)(ctx.projectDir, ctx.exp);
31
+ }
32
+ catch (error) {
33
+ if (error instanceof bundleIdentifier_1.AmbiguousBundleIdentifierError) {
34
+ log_1.default.warn('bundleIdentifier in the Xcode project is ambiguous, specify it via "bundleIdentifier" field in the submit profile in the eas.json.');
35
+ return null;
36
+ }
37
+ throw new Error(`Failed to resolve bundleIdentifier in the Xcode project: ${error.message}.`);
38
+ }
39
+ }
40
+ async function promptForBundleIdentifierAsync() {
41
+ const { bundleIdentifier } = await (0, prompts_1.promptAsync)({
42
+ name: 'bundleIdentifier',
43
+ message: 'Bundle identifier:',
44
+ type: 'text',
45
+ validate: value => ((0, bundleIdentifier_1.isBundleIdentifierValid)(value) ? true : bundleIdentifier_1.INVALID_BUNDLE_IDENTIFIER_MESSAGE),
46
+ });
47
+ return bundleIdentifier;
48
+ }
49
+ async function getAscApiKeyFromCredentialsServiceAsync(ctx) {
50
+ var _a, _b, _c;
51
+ const bundleIdentifier = (_c = (_b = (_a = ctx.applicationIdentifierOverride) !== null && _a !== void 0 ? _a : ctx.profile.bundleIdentifier) !== null && _b !== void 0 ? _b : (await maybeGetIosBundleIdentifierAsync(ctx))) !== null && _c !== void 0 ? _c : (await promptForBundleIdentifierAsync());
52
+ log_1.default.log(`Looking up credentials configuration for ${bundleIdentifier}...`);
53
+ const appLookupParams = {
54
+ account: (0, nullthrows_1.default)(ctx.user.accounts.find(a => a.name === ctx.accountName), `You do not have access to account: ${ctx.accountName}`),
55
+ projectName: ctx.projectName,
56
+ bundleIdentifier,
57
+ };
58
+ const setupAscApiKeyAction = new SetUpAscApiKey_1.SetUpAscApiKey(appLookupParams, AscApiKeyUtils_1.AppStoreApiKeyPurpose.SUBMISSION_SERVICE);
59
+ const iosAppCredentials = await setupAscApiKeyAction.runAsync(ctx.credentialsCtx);
60
+ const ascKeyForSubmissions = (0, nullthrows_1.default)(iosAppCredentials.appStoreConnectApiKeyForSubmissions, `An EAS Submit ASC Api Key could not be found for ${iosAppCredentials.appleAppIdentifier.bundleIdentifier}`);
61
+ const { id, keyIdentifier, name } = ascKeyForSubmissions;
62
+ log_1.default.log(`Using Api Key ID: ${keyIdentifier}${name ? ` (${name})` : ''}`);
63
+ return {
64
+ result: {
65
+ ascApiKeyId: id,
66
+ },
67
+ summary: {
68
+ source: 'EAS servers',
69
+ keyId: keyIdentifier,
70
+ name: name !== null && name !== void 0 ? name : undefined,
71
+ },
72
+ };
73
+ }
14
74
  async function getAscApiKeyLocallyAsync(ctx, source) {
15
75
  const ascApiKeyPath = await getAscApiKeyPathAsync(ctx, source);
16
76
  const { keyP8Path, keyId, issuerId } = ascApiKeyPath;
@@ -31,6 +91,8 @@ async function getAscApiKeyPathAsync(ctx, source) {
31
91
  return await handlePathSourceAsync(ctx, source);
32
92
  case AscApiKeySourceType.prompt:
33
93
  return await handlePromptSourceAsync(ctx, source);
94
+ case AscApiKeySourceType.credentialsService:
95
+ throw new Error(`AscApiKeySourceType ${source} does not return a path.`);
34
96
  }
35
97
  }
36
98
  exports.getAscApiKeyPathAsync = getAscApiKeyPathAsync;
@@ -6,7 +6,6 @@ export default class IosSubmitCommand {
6
6
  constructor(ctx: SubmissionContext<Platform.IOS>);
7
7
  runAsync(): Promise<SubmissionFragment>;
8
8
  private resolveSubmissionOptionsAsync;
9
- private maybeGetIosBundleIdentifierAsync;
10
9
  private resolveCredentialSubmissionOptionsAsync;
11
10
  private resolveAppSpecificPasswordSource;
12
11
  private resolveAscApiKeySource;
@@ -7,12 +7,10 @@ const getenv_1 = tslib_1.__importDefault(require("getenv"));
7
7
  const wrap_ansi_1 = tslib_1.__importDefault(require("wrap-ansi"));
8
8
  const errors_1 = require("../../credentials/errors");
9
9
  const log_1 = tslib_1.__importStar(require("../../log"));
10
- const bundleIdentifier_1 = require("../../project/ios/bundleIdentifier");
11
10
  const commons_1 = require("../commons");
12
11
  const AppProduce_1 = require("./AppProduce");
13
12
  const AppSpecificPasswordSource_1 = require("./AppSpecificPasswordSource");
14
13
  const AscApiKeySource_1 = require("./AscApiKeySource");
15
- const CredentialsServiceSource_1 = require("./CredentialsServiceSource");
16
14
  const IosSubmitter_1 = tslib_1.__importDefault(require("./IosSubmitter"));
17
15
  class IosSubmitCommand {
18
16
  constructor(ctx) {
@@ -31,15 +29,11 @@ class IosSubmitCommand {
31
29
  ? credentialsSource.appSpecificPasswordSource
32
30
  : null;
33
31
  const maybeAscApiKeySource = 'ascApiKeySource' in credentialsSource ? credentialsSource.ascApiKeySource : null;
34
- const maybeCredentialsServiceSource = 'credentialsServiceSource' in credentialsSource
35
- ? credentialsSource.credentialsServiceSource
36
- : null;
37
32
  const ascAppIdentifier = await this.resolveAscAppIdentifierAsync();
38
33
  const errored = [
39
34
  archiveSource,
40
35
  ...(maybeAppSpecificPasswordSource ? [maybeAppSpecificPasswordSource] : []),
41
36
  ...(maybeAscApiKeySource ? [maybeAscApiKeySource] : []),
42
- ...(maybeCredentialsServiceSource ? [maybeCredentialsServiceSource] : []),
43
37
  ascAppIdentifier,
44
38
  ].filter(r => !r.ok);
45
39
  if (errored.length > 0) {
@@ -61,57 +55,18 @@ class IosSubmitCommand {
61
55
  ascApiKeySource: maybeAscApiKeySource.enforceValue(),
62
56
  }
63
57
  : null),
64
- ...(maybeCredentialsServiceSource
65
- ? {
66
- credentialsServiceSource: maybeCredentialsServiceSource.enforceValue(),
67
- }
68
- : null),
69
58
  };
70
59
  }
71
- async maybeGetIosBundleIdentifierAsync() {
72
- try {
73
- return (0, results_1.result)(await (0, bundleIdentifier_1.getBundleIdentifierAsync)(this.ctx.projectDir, this.ctx.exp));
74
- }
75
- catch (error) {
76
- if (error instanceof bundleIdentifier_1.AmbiguousBundleIdentifierError) {
77
- log_1.default.warn('bundleIdentifier in the Xcode project is ambiguous, specify it via "bundleIdentifier" field in the submit profile in the eas.json.');
78
- return (0, results_1.result)(null);
79
- }
80
- return (0, results_1.result)(new Error(`Failed to resolve bundleIdentifier in the Xcode project: ${error.message}.`));
81
- }
82
- }
83
60
  async resolveCredentialSubmissionOptionsAsync() {
84
- var _a;
85
- const ascApiKeySource = this.resolveAscApiKeySource();
86
- const shouldSkipAscApiKeySource = !ascApiKeySource.ok && ascApiKeySource.enforceError() instanceof errors_1.MissingCredentialsError;
87
- if (!shouldSkipAscApiKeySource) {
88
- return { ascApiKeySource };
89
- }
61
+ // if an App Specific Password env var is not specified, use ASC Api Key
90
62
  const appSpecificPasswordSource = this.resolveAppSpecificPasswordSource();
91
63
  const shouldSkipAppSpecificPasswordSource = !appSpecificPasswordSource.ok &&
92
64
  appSpecificPasswordSource.enforceError() instanceof errors_1.MissingCredentialsError;
93
65
  if (!shouldSkipAppSpecificPasswordSource) {
94
66
  return { appSpecificPasswordSource: this.resolveAppSpecificPasswordSource() };
95
67
  }
96
- let bundleIdentifier = (_a = this.ctx.applicationIdentifierOverride) !== null && _a !== void 0 ? _a : this.ctx.profile.bundleIdentifier;
97
- if (!bundleIdentifier) {
98
- const bundleIdentifierResult = await this.maybeGetIosBundleIdentifierAsync();
99
- if (!bundleIdentifierResult.ok) {
100
- return {
101
- credentialsServiceSource: (0, results_1.result)(bundleIdentifierResult.reason),
102
- };
103
- }
104
- const bundleIdentifierValue = bundleIdentifierResult.enforceValue();
105
- if (bundleIdentifierValue) {
106
- bundleIdentifier = bundleIdentifierValue;
107
- }
108
- }
109
- return {
110
- credentialsServiceSource: (0, results_1.result)({
111
- sourceType: CredentialsServiceSource_1.CREDENTIALS_SERVICE_SOURCE,
112
- bundleIdentifier,
113
- }),
114
- };
68
+ const ascApiKeySource = this.resolveAscApiKeySource();
69
+ return { ascApiKeySource };
115
70
  }
116
71
  resolveAppSpecificPasswordSource() {
117
72
  const envAppSpecificPassword = getenv_1.default.string('EXPO_APPLE_APP_SPECIFIC_PASSWORD', '');
@@ -147,7 +102,7 @@ class IosSubmitCommand {
147
102
  sourceType: AscApiKeySource_1.AscApiKeySourceType.prompt,
148
103
  });
149
104
  }
150
- return (0, results_1.result)(new errors_1.MissingCredentialsError('Set the ascApiKeyPath, ascApiKeyIssuerId and ascApiKeyId fields in eas.json.'));
105
+ return (0, results_1.result)({ sourceType: AscApiKeySource_1.AscApiKeySourceType.credentialsService });
151
106
  }
152
107
  resolveArchiveSource() {
153
108
  try {
@@ -5,13 +5,11 @@ import BaseSubmitter, { SubmissionInput } from '../BaseSubmitter';
5
5
  import { SubmissionContext } from '../context';
6
6
  import { AppSpecificPasswordCredentials, AppSpecificPasswordSource } from './AppSpecificPasswordSource';
7
7
  import { AscApiKeyResult, AscApiKeySource } from './AscApiKeySource';
8
- import { CredentialsServiceSource } from './CredentialsServiceSource';
9
8
  export interface IosSubmissionOptions extends Pick<IosSubmissionConfigInput, 'appleIdUsername' | 'ascAppIdentifier'> {
10
9
  projectId: string;
11
10
  archiveSource: ArchiveSource;
12
11
  appSpecificPasswordSource?: AppSpecificPasswordSource;
13
12
  ascApiKeySource?: AscApiKeySource;
14
- credentialsServiceSource?: CredentialsServiceSource;
15
13
  }
16
14
  interface ResolvedSourceOptions {
17
15
  archive: ResolvedArchiveSource;
@@ -11,7 +11,6 @@ const BaseSubmitter_1 = tslib_1.__importDefault(require("../BaseSubmitter"));
11
11
  const summary_1 = require("../utils/summary");
12
12
  const AppSpecificPasswordSource_1 = require("./AppSpecificPasswordSource");
13
13
  const AscApiKeySource_1 = require("./AscApiKeySource");
14
- const CredentialsServiceSource_1 = require("./CredentialsServiceSource");
15
14
  class IosSubmitter extends BaseSubmitter_1.default {
16
15
  constructor(ctx, options) {
17
16
  const sourceOptionsResolver = {
@@ -28,15 +27,11 @@ class IosSubmitter extends BaseSubmitter_1.default {
28
27
  ? await (0, AppSpecificPasswordSource_1.getAppSpecificPasswordLocallyAsync)(this.ctx, this.options.appSpecificPasswordSource)
29
28
  : null;
30
29
  const maybeAppStoreConnectApiKey = this.options.ascApiKeySource
31
- ? await (0, AscApiKeySource_1.getAscApiKeyLocallyAsync)(this.ctx, this.options.ascApiKeySource)
32
- : null;
33
- const maybeAscOrAspFromCredentialsService = this.options.credentialsServiceSource
34
- ? await (0, CredentialsServiceSource_1.getFromCredentialsServiceAsync)(this.ctx, this.options.credentialsServiceSource)
30
+ ? await (0, AscApiKeySource_1.getAscApiKeyResultAsync)(this.ctx, this.options.ascApiKeySource)
35
31
  : null;
36
32
  return {
37
33
  ...(maybeAppSpecificPassword ? { appSpecificPassword: maybeAppSpecificPassword } : null),
38
34
  ...(maybeAppStoreConnectApiKey ? { ascApiKeyResult: maybeAppStoreConnectApiKey } : null),
39
- ...(maybeAscOrAspFromCredentialsService ? maybeAscOrAspFromCredentialsService : null),
40
35
  };
41
36
  },
42
37
  };
@@ -1,9 +1,9 @@
1
1
  import { ExpoConfig } from '@expo/config';
2
- import { Maybe, Robot, Update, UpdateBranchFragment, UpdateFragment, User } from '../graphql/generated';
2
+ import { Robot, SsoUser, Update, UpdateBranchFragment, UpdateFragment, User } from '../graphql/generated';
3
3
  import { RequestedPlatform } from '../platform';
4
4
  import { ProfileData } from '../utils/profiles';
5
5
  export type FormatUpdateParameter = Pick<Update, 'id' | 'createdAt' | 'message'> & {
6
- actor?: Maybe<Pick<User, 'username' | 'id'> | Pick<Robot, 'firstName' | 'id'>>;
6
+ actor?: Pick<Robot, '__typename' | 'firstName'> | Pick<User, '__typename' | 'username'> | Pick<SsoUser, '__typename' | 'username'> | null;
7
7
  };
8
8
  export type UpdateJsonInfo = {
9
9
  branch: string;
@@ -94,7 +94,8 @@ function formatUpdateTitle(update) {
94
94
  const { message, createdAt, actor, runtimeVersion } = update;
95
95
  let actorName;
96
96
  switch (actor === null || actor === void 0 ? void 0 : actor.__typename) {
97
- case 'User': {
97
+ case 'User':
98
+ case 'SSOUser': {
98
99
  actorName = actor.username;
99
100
  break;
100
101
  }
@@ -103,8 +104,9 @@ function formatUpdateTitle(update) {
103
104
  actorName = firstName !== null && firstName !== void 0 ? firstName : `robot: ${id.slice(0, 4)}...`;
104
105
  break;
105
106
  }
106
- default:
107
+ case undefined: {
107
108
  actorName = 'unknown';
109
+ }
108
110
  }
109
111
  return `[${(0, dateformat_1.default)(createdAt, 'mmm dd HH:MM')} by ${actorName}, runtimeVersion: ${runtimeVersion}] ${message}`;
110
112
  }
@@ -1,9 +1,9 @@
1
- import { CurrentUserQuery } from '../graphql/generated';
1
+ import { CurrentUserQuery, Robot, SsoUser, User } from '../graphql/generated';
2
2
  export type Actor = NonNullable<CurrentUserQuery['meActor']>;
3
3
  /**
4
4
  * Resolve the name of the actor, either normal 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
  */
8
- export declare function getActorDisplayName(actor?: Actor): string;
8
+ export declare function getActorDisplayName(actor?: Pick<Robot, '__typename' | 'firstName'> | Pick<User, '__typename' | 'username'> | Pick<SsoUser, '__typename' | 'username'> | null): string;
9
9
  export declare function getActorUsername(actor?: Actor): string | null;