eas-cli 13.4.2 → 14.0.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 (203) hide show
  1. package/README.md +73 -73
  2. package/build/ApiV2Error.js +5 -1
  3. package/build/analytics/AnalyticsManager.js +5 -4
  4. package/build/api.js +1 -0
  5. package/build/branch/actions/SelectBranch.js +1 -0
  6. package/build/branch/queries.d.ts +3 -3
  7. package/build/branch/queries.js +7 -5
  8. package/build/build/validate.js +6 -3
  9. package/build/channel/actions/SelectChannel.js +1 -0
  10. package/build/channel/queries.d.ts +0 -1
  11. package/build/channel/queries.js +11 -16
  12. package/build/commandUtils/EasCommand.js +100 -90
  13. package/build/commandUtils/builds.d.ts +1 -0
  14. package/build/commandUtils/builds.js +3 -0
  15. package/build/commandUtils/gating/FeatureGateEnvOverrides.js +1 -1
  16. package/build/commandUtils/gating/FeatureGating.js +2 -0
  17. package/build/commands/account/login.js +16 -18
  18. package/build/commands/account/logout.js +6 -8
  19. package/build/commands/account/view.js +8 -10
  20. package/build/commands/analytics.js +2 -2
  21. package/build/commands/branch/create.js +18 -20
  22. package/build/commands/branch/delete.js +17 -19
  23. package/build/commands/branch/list.js +11 -13
  24. package/build/commands/branch/publish.js +2 -2
  25. package/build/commands/branch/rename.js +18 -20
  26. package/build/commands/branch/view.js +19 -21
  27. package/build/commands/build/cancel.js +22 -24
  28. package/build/commands/build/configure.js +15 -17
  29. package/build/commands/build/delete.js +22 -24
  30. package/build/commands/build/index.js +81 -83
  31. package/build/commands/build/inspect.js +42 -44
  32. package/build/commands/build/internal.js +32 -34
  33. package/build/commands/build/list.js +58 -60
  34. package/build/commands/build/resign.js +36 -38
  35. package/build/commands/build/run.js +36 -38
  36. package/build/commands/build/version/get.js +21 -23
  37. package/build/commands/build/version/set.js +20 -22
  38. package/build/commands/build/version/sync.js +20 -22
  39. package/build/commands/build/view.js +12 -14
  40. package/build/commands/channel/create.js +17 -19
  41. package/build/commands/channel/delete.js +18 -20
  42. package/build/commands/channel/edit.js +20 -22
  43. package/build/commands/channel/list.js +12 -14
  44. package/build/commands/channel/pause.js +20 -22
  45. package/build/commands/channel/resume.js +20 -22
  46. package/build/commands/channel/rollout.js +74 -76
  47. package/build/commands/channel/view.js +18 -20
  48. package/build/commands/config.js +21 -23
  49. package/build/commands/credentials/configure-build.js +21 -23
  50. package/build/commands/credentials/index.js +13 -15
  51. package/build/commands/device/create.js +6 -8
  52. package/build/commands/device/delete.js +12 -14
  53. package/build/commands/device/list.js +12 -14
  54. package/build/commands/device/rename.js +13 -15
  55. package/build/commands/device/view.js +8 -10
  56. package/build/commands/diagnostics.js +6 -8
  57. package/build/commands/env/create.js +39 -41
  58. package/build/commands/env/delete.js +25 -27
  59. package/build/commands/env/exec.js +22 -24
  60. package/build/commands/env/get.js +26 -28
  61. package/build/commands/env/link.js +27 -29
  62. package/build/commands/env/list.js +27 -29
  63. package/build/commands/env/pull.js +23 -25
  64. package/build/commands/env/push.js +21 -23
  65. package/build/commands/env/unlink.js +23 -25
  66. package/build/commands/env/update.js +38 -40
  67. package/build/commands/fingerprint/compare.d.ts +28 -0
  68. package/build/commands/fingerprint/compare.js +324 -0
  69. package/build/commands/metadata/lint.js +18 -20
  70. package/build/commands/metadata/pull.js +15 -17
  71. package/build/commands/metadata/push.js +15 -17
  72. package/build/commands/open.js +6 -8
  73. package/build/commands/project/info.js +6 -8
  74. package/build/commands/project/init.js +26 -28
  75. package/build/commands/project/onboarding.js +10 -12
  76. package/build/commands/secret/create.js +30 -32
  77. package/build/commands/secret/delete.js +14 -16
  78. package/build/commands/secret/list.js +7 -9
  79. package/build/commands/secret/push.js +23 -25
  80. package/build/commands/submit/internal.js +23 -25
  81. package/build/commands/submit.js +54 -56
  82. package/build/commands/update/configure.js +18 -20
  83. package/build/commands/update/delete.js +16 -18
  84. package/build/commands/update/edit.js +25 -27
  85. package/build/commands/update/index.js +65 -67
  86. package/build/commands/update/list.js +21 -23
  87. package/build/commands/update/republish.js +45 -47
  88. package/build/commands/update/roll-back-to-embedded.d.ts +2 -1
  89. package/build/commands/update/roll-back-to-embedded.js +92 -84
  90. package/build/commands/update/rollback.js +7 -7
  91. package/build/commands/update/view.js +16 -18
  92. package/build/commands/webhook/create.js +20 -22
  93. package/build/commands/webhook/delete.js +17 -19
  94. package/build/commands/webhook/list.js +14 -16
  95. package/build/commands/webhook/update.js +23 -25
  96. package/build/commands/webhook/view.js +13 -15
  97. package/build/commands/worker/alias.js +30 -32
  98. package/build/commands/worker/deploy.js +38 -40
  99. package/build/commands/workflow/create.js +16 -18
  100. package/build/commands/workflow/run.js +13 -15
  101. package/build/commands/workflow/validate.js +18 -20
  102. package/build/credentials/android/AndroidCredentialsProvider.js +3 -1
  103. package/build/credentials/android/actions/AssignFcm.js +1 -0
  104. package/build/credentials/android/actions/AssignGoogleServiceAccountKeyForFcmV1.js +1 -0
  105. package/build/credentials/android/actions/AssignGoogleServiceAccountKeyForSubmissions.js +1 -0
  106. package/build/credentials/android/actions/CreateFcm.js +1 -0
  107. package/build/credentials/android/actions/CreateGoogleServiceAccountKey.js +1 -0
  108. package/build/credentials/android/actions/CreateKeystore.js +1 -0
  109. package/build/credentials/android/actions/DownloadKeystore.js +2 -0
  110. package/build/credentials/android/actions/RemoveFcm.js +1 -0
  111. package/build/credentials/android/actions/RemoveGoogleServiceAccountKey.js +2 -0
  112. package/build/credentials/android/actions/RemoveKeystore.js +1 -0
  113. package/build/credentials/android/actions/SetUpBuildCredentials.js +1 -0
  114. package/build/credentials/android/actions/SetUpBuildCredentialsFromCredentialsJson.js +1 -0
  115. package/build/credentials/android/actions/SetUpGoogleServiceAccountKeyForFcmV1.js +1 -0
  116. package/build/credentials/android/actions/SetUpGoogleServiceAccountKeyForSubmissions.js +1 -0
  117. package/build/credentials/android/actions/UseExistingGoogleServiceAccountKey.js +1 -0
  118. package/build/credentials/context.js +14 -5
  119. package/build/credentials/errors.js +1 -0
  120. package/build/credentials/ios/IosCredentialsProvider.js +3 -1
  121. package/build/credentials/ios/actions/AssignAscApiKey.js +1 -0
  122. package/build/credentials/ios/actions/AssignPushKey.js +1 -0
  123. package/build/credentials/ios/actions/ConfigureProvisioningProfile.js +4 -0
  124. package/build/credentials/ios/actions/CreateAscApiKey.js +1 -0
  125. package/build/credentials/ios/actions/CreateDistributionCertificate.js +1 -0
  126. package/build/credentials/ios/actions/CreateProvisioningProfile.js +3 -0
  127. package/build/credentials/ios/actions/CreatePushKey.js +1 -0
  128. package/build/credentials/ios/actions/RemoveAscApiKey.js +2 -0
  129. package/build/credentials/ios/actions/RemoveDistributionCertificate.js +3 -0
  130. package/build/credentials/ios/actions/RemoveProvisioningProfile.js +2 -0
  131. package/build/credentials/ios/actions/RemovePushKey.js +2 -0
  132. package/build/credentials/ios/actions/SetUpAdhocProvisioningProfile.js +1 -0
  133. package/build/credentials/ios/actions/SetUpAscApiKey.js +9 -7
  134. package/build/credentials/ios/actions/SetUpBuildCredentials.js +1 -0
  135. package/build/credentials/ios/actions/SetUpBuildCredentialsFromCredentialsJson.js +3 -0
  136. package/build/credentials/ios/actions/SetUpDistributionCertificate.js +3 -0
  137. package/build/credentials/ios/actions/SetUpInternalProvisioningProfile.js +1 -0
  138. package/build/credentials/ios/actions/SetUpProvisioningProfile.js +3 -0
  139. package/build/credentials/ios/actions/SetUpPushKey.js +1 -0
  140. package/build/credentials/ios/actions/SetUpTargetBuildCredentials.js +1 -0
  141. package/build/credentials/ios/actions/SetUpTargetBuildCredentialsFromCredentialsJson.js +3 -0
  142. package/build/credentials/ios/actions/UpdateCredentialsJson.js +3 -0
  143. package/build/credentials/ios/appstore/AppStoreApi.js +2 -0
  144. package/build/credentials/manager/CheckBuildProfileFlagAgainstEasJson.js +3 -0
  145. package/build/credentials/manager/CreateAndroidBuildCredentials.js +1 -0
  146. package/build/credentials/manager/ManageAndroid.js +2 -0
  147. package/build/credentials/manager/ManageIos.js +2 -0
  148. package/build/credentials/manager/SelectAndroidBuildCredentials.js +2 -0
  149. package/build/credentials/manager/SelectBuildProfileFromEasJson.js +2 -0
  150. package/build/credentials/manager/SelectIosDistributionTypeGraphqlFromBuildProfile.js +1 -0
  151. package/build/credentials/manager/SelectPlatform.js +7 -0
  152. package/build/credentials/manager/SetDefaultAndroidKeystore.js +1 -0
  153. package/build/credentials/manager/SetUpAndroidBuildCredentials.js +1 -0
  154. package/build/credentials/manager/SetUpBuildCredentialsCommandAction.js +9 -0
  155. package/build/credentials/manager/SetUpIosBuildCredentials.js +1 -0
  156. package/build/devices/actions/create/action.js +4 -0
  157. package/build/devices/manager.js +4 -0
  158. package/build/fetch.js +1 -0
  159. package/build/graphql/generated.d.ts +175 -0
  160. package/build/graphql/generated.js +8 -3
  161. package/build/graphql/queries/BuildQuery.d.ts +4 -1
  162. package/build/graphql/queries/BuildQuery.js +19 -0
  163. package/build/graphql/types/Build.d.ts +1 -0
  164. package/build/graphql/types/Build.js +15 -1
  165. package/build/graphql/types/Fingerprint.d.ts +1 -0
  166. package/build/graphql/types/Fingerprint.js +12 -0
  167. package/build/log.js +2 -2
  168. package/build/metadata/apple/config/reader.js +1 -0
  169. package/build/metadata/apple/config/writer.js +1 -0
  170. package/build/metadata/apple/tasks/age-rating.js +1 -4
  171. package/build/metadata/apple/tasks/app-info.js +1 -4
  172. package/build/metadata/apple/tasks/app-review-detail.js +1 -4
  173. package/build/metadata/apple/tasks/app-version.js +2 -1
  174. package/build/metadata/errors.js +5 -0
  175. package/build/rollout/actions/CreateRollout.d.ts +9 -10
  176. package/build/rollout/actions/CreateRollout.js +2 -0
  177. package/build/rollout/actions/EditRollout.d.ts +2 -3
  178. package/build/rollout/actions/EditRollout.js +2 -0
  179. package/build/rollout/actions/EndRollout.d.ts +4 -6
  180. package/build/rollout/actions/EndRollout.js +2 -0
  181. package/build/rollout/actions/ManageRollout.d.ts +2 -3
  182. package/build/rollout/actions/ManageRollout.js +2 -0
  183. package/build/rollout/actions/NonInteractiveRollout.d.ts +6 -27
  184. package/build/rollout/actions/NonInteractiveRollout.js +1 -0
  185. package/build/rollout/actions/RolloutMainMenu.d.ts +6 -7
  186. package/build/rollout/actions/RolloutMainMenu.js +1 -0
  187. package/build/rollout/actions/SelectRuntime.d.ts +6 -20
  188. package/build/rollout/actions/SelectRuntime.js +3 -0
  189. package/build/submit/BaseSubmitter.js +4 -0
  190. package/build/submit/android/AndroidSubmitCommand.js +1 -0
  191. package/build/submit/ios/IosSubmitCommand.js +1 -0
  192. package/build/update/getBranchFromChannelNameAndCreateAndLinkIfNotExistsAsync.js +3 -3
  193. package/build/user/SessionManager.js +2 -0
  194. package/build/utils/fingerprint.d.ts +97 -0
  195. package/build/utils/fingerprint.js +5 -0
  196. package/build/utils/fingerprintCli.d.ts +5 -7
  197. package/build/utils/fingerprintCli.js +11 -1
  198. package/build/utils/fingerprintDiff.d.ts +33 -0
  199. package/build/utils/fingerprintDiff.js +122 -0
  200. package/build/vcs/clients/git.js +1 -0
  201. package/build/vcs/local.js +2 -1
  202. package/oclif.manifest.json +51 -7
  203. package/package.json +9 -7
@@ -135,12 +135,13 @@ const RudderstackAnalyticsConfig = process.env.EXPO_STAGING || process.env.EXPO_
135
135
  rudderstackDataPlaneURL: 'https://cdp.expo.dev',
136
136
  };
137
137
  class RudderstackAnalytics {
138
+ persistentDeviceId;
139
+ rudderstackClient = new rudder_sdk_node_1.default(RudderstackAnalyticsConfig.rudderstackWriteKey, new url_1.URL('/v1/batch', RudderstackAnalyticsConfig.rudderstackDataPlaneURL).toString(), {
140
+ flushInterval: 300,
141
+ });
142
+ identifiedActor = null;
138
143
  constructor(persistentDeviceId) {
139
144
  this.persistentDeviceId = persistentDeviceId;
140
- this.rudderstackClient = new rudder_sdk_node_1.default(RudderstackAnalyticsConfig.rudderstackWriteKey, new url_1.URL('/v1/batch', RudderstackAnalyticsConfig.rudderstackDataPlaneURL).toString(), {
141
- flushInterval: 300,
142
- });
143
- this.identifiedActor = null;
144
145
  // identify once with just anonymous ID. Once the actor is fetched, re-indentify with
145
146
  // both so that they can be associated
146
147
  this.rudderstackClient.identify({
package/build/api.js CHANGED
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
5
5
  const ApiV2Error_1 = require("./ApiV2Error");
6
6
  const fetch_1 = tslib_1.__importStar(require("./fetch"));
7
7
  class ApiV2Client {
8
+ authInfo;
8
9
  constructor(authInfo) {
9
10
  this.authInfo = authInfo;
10
11
  }
@@ -22,6 +22,7 @@ const relay_1 = require("../../utils/relay");
22
22
  * @args willFetchAgain If the query will fetch again to get a complete page.
23
23
  */
24
24
  class SelectBranch {
25
+ options;
25
26
  constructor(options = {}) {
26
27
  this.options = options;
27
28
  }
@@ -1,6 +1,6 @@
1
1
  import { ExpoGraphqlClient } from '../commandUtils/context/contextUtils/createGraphqlClient';
2
2
  import { PaginatedQueryOptions } from '../commandUtils/pagination';
3
- import { CreateUpdateBranchForAppMutationVariables, UpdateBranch, UpdateBranchFragment } from '../graphql/generated';
3
+ import { CreateUpdateBranchForAppMutationVariables, UpdateBranchBasicInfoFragment, UpdateBranchFragment } from '../graphql/generated';
4
4
  import { SelectPromptEntry } from '../utils/queries';
5
5
  export declare const BRANCHES_LIMIT = 50;
6
6
  export declare function selectBranchOnAppAsync(graphqlClient: ExpoGraphqlClient, { projectId, promptTitle, displayTextForListItem, paginatedQueryOptions, }: {
@@ -13,11 +13,11 @@ export declare function listAndRenderBranchesOnAppAsync(graphqlClient: ExpoGraph
13
13
  projectId: string;
14
14
  paginatedQueryOptions: PaginatedQueryOptions;
15
15
  }): Promise<void>;
16
- export declare function createUpdateBranchOnAppAsync(graphqlClient: ExpoGraphqlClient, { appId, name }: CreateUpdateBranchForAppMutationVariables): Promise<Pick<UpdateBranch, 'id' | 'name'>>;
16
+ export declare function createUpdateBranchOnAppAsync(graphqlClient: ExpoGraphqlClient, { appId, name }: CreateUpdateBranchForAppMutationVariables): Promise<UpdateBranchBasicInfoFragment>;
17
17
  export declare function ensureBranchExistsAsync(graphqlClient: ExpoGraphqlClient, { appId, branchName, }: {
18
18
  appId: string;
19
19
  branchName: string;
20
20
  }): Promise<{
21
- branchId: string;
21
+ branch: UpdateBranchBasicInfoFragment;
22
22
  createdBranch: boolean;
23
23
  }>;
@@ -3,10 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ensureBranchExistsAsync = exports.createUpdateBranchOnAppAsync = exports.listAndRenderBranchesOnAppAsync = exports.selectBranchOnAppAsync = exports.BRANCHES_LIMIT = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
+ const graphql_1 = require("graphql");
6
7
  const graphql_tag_1 = tslib_1.__importDefault(require("graphql-tag"));
7
8
  const utils_1 = require("./utils");
8
9
  const client_1 = require("../graphql/client");
9
10
  const BranchQuery_1 = require("../graphql/queries/BranchQuery");
11
+ const UpdateBranchBasicInfo_1 = require("../graphql/types/UpdateBranchBasicInfo");
10
12
  const log_1 = tslib_1.__importDefault(require("../log"));
11
13
  const utils_2 = require("../update/utils");
12
14
  const json_1 = require("../utils/json");
@@ -79,14 +81,15 @@ async function createUpdateBranchOnAppAsync(graphqlClient, { appId, name }) {
79
81
  updateBranch {
80
82
  createUpdateBranchForApp(appId: $appId, name: $name) {
81
83
  id
82
- name
84
+ ...UpdateBranchBasicInfoFragment
83
85
  }
84
86
  }
85
87
  }
88
+ ${(0, graphql_1.print)(UpdateBranchBasicInfo_1.UpdateBranchBasicInfoFragmentNode)}
86
89
  `, {
87
90
  appId,
88
91
  name,
89
- })
92
+ }, { additionalTypenames: ['UpdateBranch'] })
90
93
  .toPromise());
91
94
  const newBranch = result.updateBranch.createUpdateBranchForApp;
92
95
  if (!newBranch) {
@@ -101,8 +104,7 @@ async function ensureBranchExistsAsync(graphqlClient, { appId, branchName, }) {
101
104
  appId,
102
105
  name: branchName,
103
106
  });
104
- const { id } = updateBranch;
105
- return { branchId: id, createdBranch: false };
107
+ return { branch: updateBranch, createdBranch: false };
106
108
  }
107
109
  catch (error) {
108
110
  if (error instanceof utils_1.BranchNotFoundError) {
@@ -110,7 +112,7 @@ async function ensureBranchExistsAsync(graphqlClient, { appId, branchName, }) {
110
112
  appId,
111
113
  name: branchName,
112
114
  });
113
- return { branchId: newUpdateBranch.id, createdBranch: true };
115
+ return { branch: newUpdateBranch, createdBranch: true };
114
116
  }
115
117
  else {
116
118
  throw error;
@@ -24,14 +24,17 @@ async function checkGoogleServicesFileAsync(ctx) {
24
24
  if (!googleServicesFilePath) {
25
25
  return;
26
26
  }
27
+ const googleServicesEnvVar = ctx.platform === eas_build_job_1.Platform.ANDROID
28
+ ? ctx.env.GOOGLE_SERVICES_JSON
29
+ : ctx.env.GOOGLE_SERVICES_INFO_PLIST;
27
30
  const rootDir = path_1.default.normalize(await ctx.vcsClient.getRootPathAsync());
28
31
  const absGoogleServicesFilePath = path_1.default.resolve(ctx.projectDir, googleServicesFilePath);
29
32
  if ((await fs_extra_1.default.pathExists(absGoogleServicesFilePath)) &&
30
33
  (!isInsideDirectory(absGoogleServicesFilePath, rootDir) ||
31
- (await ctx.vcsClient.isFileIgnoredAsync(path_1.default.relative(rootDir, absGoogleServicesFilePath))))) {
34
+ (await ctx.vcsClient.isFileIgnoredAsync(path_1.default.relative(rootDir, absGoogleServicesFilePath)))) &&
35
+ !googleServicesEnvVar) {
32
36
  log_1.default.warn(`File specified via "${ctx.platform}.googleServicesFile" field in your app.json is not checked in to your repository and won't be uploaded to the builder.`);
33
- log_1.default.warn(`Use EAS Secret to pass all values that you don't want to include in your version control. ${(0, log_1.learnMore)('https://docs.expo.dev/build-reference/variables/#using-secrets-in-environment-variables')}`);
34
- log_1.default.warn(`If you are using that file for compatibility with the classic build service (expo build) you can silence this warning by setting your build profile's env.GOOGLE_SERVICES_FILE in eas.json to any non-empty string.`);
37
+ log_1.default.warn(`Use EAS file environment variables with secret or sensitive visibility to pass all values that you don't want to include in your version control to build process. ${(0, log_1.learnMore)('https://docs.expo.dev/eas/environment-variables/#file-environment-variables')}`);
35
38
  log_1.default.newLine();
36
39
  }
37
40
  }
@@ -22,6 +22,7 @@ const relay_1 = require("../../utils/relay");
22
22
  * @args willFetchAgain If the query will fetch again to get a complete page.
23
23
  */
24
24
  class SelectChannel {
25
+ options;
25
26
  constructor(options = {}) {
26
27
  this.options = options;
27
28
  }
@@ -33,7 +33,6 @@ export declare function doesChannelExistAsync(graphqlClient: ExpoGraphqlClient,
33
33
  channelName: string;
34
34
  }): Promise<boolean>;
35
35
  /**
36
- *
37
36
  * Creates a channel and links it to a branch with the same name.
38
37
  *
39
38
  * @param appId the app ID, also known as the project ID
@@ -13,7 +13,7 @@ const client_1 = require("../graphql/client");
13
13
  const BranchQuery_1 = require("../graphql/queries/BranchQuery");
14
14
  const ChannelQuery_1 = require("../graphql/queries/ChannelQuery");
15
15
  const UpdateChannelBasicInfo_1 = require("../graphql/types/UpdateChannelBasicInfo");
16
- const log_1 = tslib_1.__importDefault(require("../log"));
16
+ const log_1 = tslib_1.__importStar(require("../log"));
17
17
  const projectUtils_1 = require("../project/projectUtils");
18
18
  const formatFields_1 = tslib_1.__importDefault(require("../utils/formatFields"));
19
19
  const json_1 = require("../utils/json");
@@ -209,7 +209,6 @@ async function doesChannelExistAsync(graphqlClient, { appId, channelName }) {
209
209
  }
210
210
  exports.doesChannelExistAsync = doesChannelExistAsync;
211
211
  /**
212
- *
213
212
  * Creates a channel and links it to a branch with the same name.
214
213
  *
215
214
  * @param appId the app ID, also known as the project ID
@@ -218,14 +217,13 @@ exports.doesChannelExistAsync = doesChannelExistAsync;
218
217
  */
219
218
  async function createAndLinkChannelAsync(graphqlClient, { appId, channelName, shouldPrintJson, }) {
220
219
  let branchId;
221
- let branchMessage;
220
+ let hasCreatedBranch = false;
222
221
  try {
223
222
  const branch = await BranchQuery_1.BranchQuery.getBranchByNameAsync(graphqlClient, {
224
223
  appId,
225
224
  name: channelName,
226
225
  });
227
226
  branchId = branch.id;
228
- branchMessage = `We found a branch with the same name`;
229
227
  }
230
228
  catch (error) {
231
229
  if (error instanceof utils_1.BranchNotFoundError) {
@@ -234,7 +232,7 @@ async function createAndLinkChannelAsync(graphqlClient, { appId, channelName, sh
234
232
  name: channelName,
235
233
  });
236
234
  branchId = newBranch.id;
237
- branchMessage = `We also went ahead and made a branch with the same name`;
235
+ hasCreatedBranch = true;
238
236
  }
239
237
  else {
240
238
  throw error;
@@ -252,18 +250,15 @@ async function createAndLinkChannelAsync(graphqlClient, { appId, channelName, sh
252
250
  (0, json_1.printJsonOnlyOutput)(newChannel);
253
251
  }
254
252
  else {
253
+ const projectDisplayName = await (0, projectUtils_1.getDisplayNameForProjectIdAsync)(graphqlClient, appId);
254
+ const learnMoreLink = (0, log_1.learnMore)('https://docs.expo.dev/eas-update/eas-cli/');
255
255
  log_1.default.addNewLineIfNone();
256
- log_1.default.withTick(`Created a new channel on project ${chalk_1.default.bold(await (0, projectUtils_1.getDisplayNameForProjectIdAsync)(graphqlClient, appId))}`);
257
- log_1.default.log((0, formatFields_1.default)([
258
- { label: 'Name', value: newChannel.name },
259
- { label: 'ID', value: newChannel.id },
260
- ]));
261
- log_1.default.addNewLineIfNone();
262
- log_1.default.withTick(`${branchMessage} and have pointed the channel at it.`);
263
- log_1.default.log((0, formatFields_1.default)([
264
- { label: 'Name', value: newChannel.name },
265
- { label: 'ID', value: branchId },
266
- ]));
256
+ if (hasCreatedBranch) {
257
+ log_1.default.withTick(`Created update channel ${chalk_1.default.bold(`"${newChannel.name}"`)} and branch ${chalk_1.default.bold(`"${newChannel.name}"`)} on ${chalk_1.default.bold(projectDisplayName)} project. ${learnMoreLink}`);
258
+ }
259
+ else {
260
+ log_1.default.withTick(`Created update channel ${chalk_1.default.bold(`"${newChannel.name}"`)} on ${chalk_1.default.bold(projectDisplayName)} project and connected it with existing ${chalk_1.default.bold(`"${newChannel.name}"`)} branch. ${learnMoreLink}`);
261
+ }
267
262
  }
268
263
  return newChannel;
269
264
  }
@@ -23,6 +23,106 @@ const log_1 = tslib_1.__importDefault(require("../log"));
23
23
  const SessionManager_1 = tslib_1.__importDefault(require("../user/SessionManager"));
24
24
  const BASE_GRAPHQL_ERROR_MESSAGE = 'GraphQL request failed.';
25
25
  class EasCommand extends core_1.Command {
26
+ static ContextOptions = {
27
+ /**
28
+ * Require this command to be run when logged-in. Returns the logged-in actor and a logged-in
29
+ * graphql client in the context.
30
+ */
31
+ LoggedIn: {
32
+ loggedIn: new LoggedInContextField_1.default(),
33
+ },
34
+ /**
35
+ * Do not require this command to be run when logged-in, but if it is get the logged-in actor and a
36
+ * maybe-logged-in graphql client.
37
+ */
38
+ MaybeLoggedIn: {
39
+ maybeLoggedIn: new MaybeLoggedInContextField_1.default(),
40
+ },
41
+ /**
42
+ * Specify this context if the logged-in requirement is only necessary in a particular execution of the command.
43
+ */
44
+ DynamicLoggedIn: {
45
+ // eslint-disable-next-line async-protect/async-suffix
46
+ getDynamicLoggedInAsync: new DynamicLoggedInContextField_1.default(),
47
+ },
48
+ /**
49
+ * Specify this context requirement if the command needs to mutate the user session.
50
+ * @deprecated Should not be used outside of session management commands, which currently only includes `login` and `logout`.
51
+ */
52
+ SessionManagment: {
53
+ sessionManager: new SessionManagementContextField_1.default(),
54
+ },
55
+ /**
56
+ * Require the project to be identified and registered on server if this command is being
57
+ * run within a project directory, null otherwise.
58
+ */
59
+ OptionalProjectConfig: {
60
+ optionalPrivateProjectConfig: new OptionalPrivateProjectConfigContextField_1.OptionalPrivateProjectConfigContextField(),
61
+ },
62
+ /**
63
+ * Require this command to be run in a project directory. Return the project directory in the context.
64
+ */
65
+ ProjectDir: {
66
+ projectDir: new ProjectDirContextField_1.default(),
67
+ },
68
+ /**
69
+ * Provides functions to load the project config when dynamic config options are needed (custom Env for example).
70
+ */
71
+ DynamicProjectConfig: {
72
+ // eslint-disable-next-line async-protect/async-suffix
73
+ getDynamicPublicProjectConfigAsync: new DynamicProjectConfigContextField_1.DynamicPublicProjectConfigContextField(),
74
+ // eslint-disable-next-line async-protect/async-suffix
75
+ getDynamicPrivateProjectConfigAsync: new DynamicProjectConfigContextField_1.DynamicPrivateProjectConfigContextField(),
76
+ },
77
+ /**
78
+ * Require the project to be identified and registered on server. Returns the project config in the context.
79
+ * This also requires the user to be logged in (getProjectIdAsync requires logged in), so also expose that context.
80
+ * Exposing the loggedIn context here helps us guarantee user identification for logging purposes.
81
+ */
82
+ ProjectConfig: {
83
+ loggedIn: new LoggedInContextField_1.default(),
84
+ privateProjectConfig: new PrivateProjectConfigContextField_1.PrivateProjectConfigContextField(),
85
+ },
86
+ /**
87
+ * Analytics manager. Returns the analytics manager in the context for use by the command.
88
+ */
89
+ Analytics: {
90
+ analytics: new AnalyticsContextField_1.default(),
91
+ },
92
+ Vcs: {
93
+ vcsClient: new VcsClientContextField_1.default(),
94
+ },
95
+ ServerSideEnvironmentVariables: {
96
+ // eslint-disable-next-line async-protect/async-suffix
97
+ getServerSideEnvironmentVariablesAsync: new ServerSideEnvironmentVariablesContextField_1.ServerSideEnvironmentVariablesContextField(),
98
+ },
99
+ /**
100
+ * Require the project to be identified and registered on server. Returns the project ID evaluated from the app config.
101
+ */
102
+ ProjectId: {
103
+ projectId: new ProjectIdContextField_1.ProjectIdContextField(),
104
+ },
105
+ };
106
+ /**
107
+ * Context allows for subclasses (commands) to declare their prerequisites in a type-safe manner.
108
+ * These declarative definitions each output a context property that is the result of the prerequisite being
109
+ * satisfied. These allow a unified common interface to be shared amongst commands in order to provide a more
110
+ * consistent CLI experience.
111
+ *
112
+ * For example, let's say a command needs the EAS project ID to make a GraphQL mutation. It should declare that
113
+ * it requires the `ProjectConfig` context, and then call `getContextAsync` to get the project ID.
114
+ */
115
+ static contextDefinition = {};
116
+ /**
117
+ * The user session manager. Responsible for coordinating all user session related state.
118
+ * If needed in a subclass, use the SessionManager ContextOption.
119
+ */
120
+ sessionManagerInternal;
121
+ /**
122
+ * The analytics manager. Used for logging analytics.
123
+ * It is set up here to ensure a consistent setup.
124
+ */
125
+ analyticsInternal;
26
126
  /**
27
127
  * Execute the context in the contextDefinition to satisfy command prerequisites.
28
128
  */
@@ -106,94 +206,4 @@ class EasCommand extends core_1.Command {
106
206
  throw sanitizedError;
107
207
  }
108
208
  }
109
- EasCommand.ContextOptions = {
110
- /**
111
- * Require this command to be run when logged-in. Returns the logged-in actor and a logged-in
112
- * graphql client in the context.
113
- */
114
- LoggedIn: {
115
- loggedIn: new LoggedInContextField_1.default(),
116
- },
117
- /**
118
- * Do not require this command to be run when logged-in, but if it is get the logged-in actor and a
119
- * maybe-logged-in graphql client.
120
- */
121
- MaybeLoggedIn: {
122
- maybeLoggedIn: new MaybeLoggedInContextField_1.default(),
123
- },
124
- /**
125
- * Specify this context if the logged-in requirement is only necessary in a particular execution of the command.
126
- */
127
- DynamicLoggedIn: {
128
- // eslint-disable-next-line async-protect/async-suffix
129
- getDynamicLoggedInAsync: new DynamicLoggedInContextField_1.default(),
130
- },
131
- /**
132
- * Specify this context requirement if the command needs to mutate the user session.
133
- * @deprecated Should not be used outside of session management commands, which currently only includes `login` and `logout`.
134
- */
135
- SessionManagment: {
136
- sessionManager: new SessionManagementContextField_1.default(),
137
- },
138
- /**
139
- * Require the project to be identified and registered on server if this command is being
140
- * run within a project directory, null otherwise.
141
- */
142
- OptionalProjectConfig: {
143
- optionalPrivateProjectConfig: new OptionalPrivateProjectConfigContextField_1.OptionalPrivateProjectConfigContextField(),
144
- },
145
- /**
146
- * Require this command to be run in a project directory. Return the project directory in the context.
147
- */
148
- ProjectDir: {
149
- projectDir: new ProjectDirContextField_1.default(),
150
- },
151
- /**
152
- * Provides functions to load the project config when dynamic config options are needed (custom Env for example).
153
- */
154
- DynamicProjectConfig: {
155
- // eslint-disable-next-line async-protect/async-suffix
156
- getDynamicPublicProjectConfigAsync: new DynamicProjectConfigContextField_1.DynamicPublicProjectConfigContextField(),
157
- // eslint-disable-next-line async-protect/async-suffix
158
- getDynamicPrivateProjectConfigAsync: new DynamicProjectConfigContextField_1.DynamicPrivateProjectConfigContextField(),
159
- },
160
- /**
161
- * Require the project to be identified and registered on server. Returns the project config in the context.
162
- * This also requires the user to be logged in (getProjectIdAsync requires logged in), so also expose that context.
163
- * Exposing the loggedIn context here helps us guarantee user identification for logging purposes.
164
- */
165
- ProjectConfig: {
166
- loggedIn: new LoggedInContextField_1.default(),
167
- privateProjectConfig: new PrivateProjectConfigContextField_1.PrivateProjectConfigContextField(),
168
- },
169
- /**
170
- * Analytics manager. Returns the analytics manager in the context for use by the command.
171
- */
172
- Analytics: {
173
- analytics: new AnalyticsContextField_1.default(),
174
- },
175
- Vcs: {
176
- vcsClient: new VcsClientContextField_1.default(),
177
- },
178
- ServerSideEnvironmentVariables: {
179
- // eslint-disable-next-line async-protect/async-suffix
180
- getServerSideEnvironmentVariablesAsync: new ServerSideEnvironmentVariablesContextField_1.ServerSideEnvironmentVariablesContextField(),
181
- },
182
- /**
183
- * Require the project to be identified and registered on server. Returns the project ID evaluated from the app config.
184
- */
185
- ProjectId: {
186
- projectId: new ProjectIdContextField_1.ProjectIdContextField(),
187
- },
188
- };
189
- /**
190
- * Context allows for subclasses (commands) to declare their prerequisites in a type-safe manner.
191
- * These declarative definitions each output a context property that is the result of the prerequisite being
192
- * satisfied. These allow a unified common interface to be shared amongst commands in order to provide a more
193
- * consistent CLI experience.
194
- *
195
- * For example, let's say a command needs the EAS project ID to make a GraphQL mutation. It should declare that
196
- * it requires the `ProjectConfig` context, and then call `getContextAsync` to get the project ID.
197
- */
198
- EasCommand.contextDefinition = {};
199
209
  exports.default = EasCommand;
@@ -9,6 +9,7 @@ export declare function fetchBuildsAsync({ graphqlClient, projectId, filters, }:
9
9
  statuses?: BuildStatus[];
10
10
  platform?: RequestedPlatform;
11
11
  profile?: string;
12
+ hasFingerprint?: boolean;
12
13
  };
13
14
  }): Promise<BuildFragment[]>;
14
15
  export declare function formatBuild(build: Pick<Build, 'id' | 'platform' | 'status' | 'createdAt'>): string;
@@ -28,6 +28,9 @@ async function fetchBuildsAsync({ graphqlClient, projectId, filters, }) {
28
28
  if (filters?.profile) {
29
29
  queryFilters['buildProfile'] = filters.profile;
30
30
  }
31
+ if (filters?.hasFingerprint) {
32
+ queryFilters['hasFingerprint'] = filters.hasFingerprint;
33
+ }
31
34
  if (!filters?.statuses) {
32
35
  builds = await BuildQuery_1.BuildQuery.viewBuildsOnAppAsync(graphqlClient, {
33
36
  appId: projectId,
@@ -10,8 +10,8 @@ function parseFeatureGateEnvVariableValue(value) {
10
10
  return value.split(',').map(v => v.trim());
11
11
  }
12
12
  class FeatureGateEnvOverrides {
13
+ map = new Map();
13
14
  constructor() {
14
- this.map = new Map();
15
15
  const overrideEnableGateKeys = new Set(parseFeatureGateEnvVariableValue(env_1.default.featureGateEnable));
16
16
  const overrideDisableGateKeys = new Set(parseFeatureGateEnvVariableValue(env_1.default.featureGateDisable));
17
17
  for (const overrideEnableKey of overrideEnableGateKeys) {
@@ -4,6 +4,8 @@ const tslib_1 = require("tslib");
4
4
  const FeatureGateKey_1 = require("./FeatureGateKey");
5
5
  const FeatureGateTestOverrides = tslib_1.__importStar(require("./FeatureGateTestOverrides"));
6
6
  class FeatureGating {
7
+ serverValues;
8
+ envOverrides;
7
9
  constructor(serverValues, envOverrides) {
8
10
  this.serverValues = serverValues;
9
11
  this.envOverrides = envOverrides;
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- var _a;
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  const tslib_1 = require("tslib");
5
4
  const core_1 = require("@oclif/core");
@@ -9,9 +8,23 @@ const log_1 = tslib_1.__importDefault(require("../../log"));
9
8
  const prompts_1 = require("../../prompts");
10
9
  const User_1 = require("../../user/User");
11
10
  class AccountLogin extends EasCommand_1.default {
11
+ static description = 'log in with your Expo account';
12
+ static aliases = ['login'];
13
+ static flags = {
14
+ // can pass either --sso or -s
15
+ sso: core_1.Flags.boolean({
16
+ description: 'Login with SSO',
17
+ char: 's',
18
+ default: false,
19
+ }),
20
+ };
21
+ static contextDefinition = {
22
+ ...this.ContextOptions.MaybeLoggedIn,
23
+ ...this.ContextOptions.SessionManagment,
24
+ };
12
25
  async runAsync() {
13
- const { flags: { sso }, } = await this.parse(_a);
14
- const { sessionManager, maybeLoggedIn: { actor }, } = await this.getContextAsync(_a, { nonInteractive: false });
26
+ const { flags: { sso }, } = await this.parse(AccountLogin);
27
+ const { sessionManager, maybeLoggedIn: { actor }, } = await this.getContextAsync(AccountLogin, { nonInteractive: false });
15
28
  if (sessionManager.getAccessToken()) {
16
29
  throw new Error('EXPO_TOKEN is set in your environment, and is being used for all EAS authentication. To use username/password authentication, unset EXPO_TOKEN in your environment and re-run the command.');
17
30
  }
@@ -28,19 +41,4 @@ class AccountLogin extends EasCommand_1.default {
28
41
  log_1.default.log('Logged in');
29
42
  }
30
43
  }
31
- _a = AccountLogin;
32
- AccountLogin.description = 'log in with your Expo account';
33
- AccountLogin.aliases = ['login'];
34
- AccountLogin.flags = {
35
- // can pass either --sso or -s
36
- sso: core_1.Flags.boolean({
37
- description: 'Login with SSO',
38
- char: 's',
39
- default: false,
40
- }),
41
- };
42
- AccountLogin.contextDefinition = {
43
- ..._a.ContextOptions.MaybeLoggedIn,
44
- ..._a.ContextOptions.SessionManagment,
45
- };
46
44
  exports.default = AccountLogin;
@@ -1,20 +1,18 @@
1
1
  "use strict";
2
- var _a;
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  const tslib_1 = require("tslib");
5
4
  const EasCommand_1 = tslib_1.__importDefault(require("../../commandUtils/EasCommand"));
6
5
  const log_1 = tslib_1.__importDefault(require("../../log"));
7
6
  class AccountLogout extends EasCommand_1.default {
7
+ static description = 'log out';
8
+ static aliases = ['logout'];
9
+ static contextDefinition = {
10
+ ...this.ContextOptions.SessionManagment,
11
+ };
8
12
  async runAsync() {
9
- const { sessionManager } = await this.getContextAsync(_a, { nonInteractive: false });
13
+ const { sessionManager } = await this.getContextAsync(AccountLogout, { nonInteractive: false });
10
14
  await sessionManager.logoutAsync();
11
15
  log_1.default.log('Logged out');
12
16
  }
13
17
  }
14
- _a = AccountLogout;
15
- AccountLogout.description = 'log out';
16
- AccountLogout.aliases = ['logout'];
17
- AccountLogout.contextDefinition = {
18
- ..._a.ContextOptions.SessionManagment,
19
- };
20
18
  exports.default = AccountLogout;
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- var _a;
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  const tslib_1 = require("tslib");
5
4
  const chalk_1 = tslib_1.__importDefault(require("chalk"));
@@ -9,8 +8,13 @@ const generated_1 = require("../../graphql/generated");
9
8
  const log_1 = tslib_1.__importDefault(require("../../log"));
10
9
  const User_1 = require("../../user/User");
11
10
  class AccountView extends EasCommand_1.default {
11
+ static description = 'show the username you are logged in as';
12
+ static aliases = ['whoami'];
13
+ static contextDefinition = {
14
+ ...this.ContextOptions.MaybeLoggedIn,
15
+ };
12
16
  async runAsync() {
13
- const { maybeLoggedIn: { actor, authenticationInfo }, } = await this.getContextAsync(_a, { nonInteractive: true });
17
+ const { maybeLoggedIn: { actor, authenticationInfo }, } = await this.getContextAsync(AccountView, { nonInteractive: true });
14
18
  if (actor) {
15
19
  const loggedInAs = authenticationInfo.accessToken
16
20
  ? `${(0, User_1.getActorDisplayName)(actor)} (authenticated using EXPO_TOKEN)`
@@ -23,8 +27,8 @@ class AccountView extends EasCommand_1.default {
23
27
  log_1.default.newLine();
24
28
  log_1.default.log('Accounts:');
25
29
  actor.accounts.forEach(account => {
26
- const roleOnAccount = _a.getRoleOnAccount(actor, account);
27
- log_1.default.log(`• ${account.name} (Role: ${_a.getLabelForRole(roleOnAccount)})`);
30
+ const roleOnAccount = AccountView.getRoleOnAccount(actor, account);
31
+ log_1.default.log(`• ${account.name} (Role: ${AccountView.getLabelForRole(roleOnAccount)})`);
28
32
  });
29
33
  }
30
34
  }
@@ -56,10 +60,4 @@ class AccountView extends EasCommand_1.default {
56
60
  }
57
61
  }
58
62
  }
59
- _a = AccountView;
60
- AccountView.description = 'show the username you are logged in as';
61
- AccountView.aliases = ['whoami'];
62
- AccountView.contextDefinition = {
63
- ..._a.ContextOptions.MaybeLoggedIn,
64
- };
65
63
  exports.default = AccountView;
@@ -5,6 +5,8 @@ const AnalyticsManager_1 = require("../analytics/AnalyticsManager");
5
5
  const EasCommand_1 = tslib_1.__importDefault(require("../commandUtils/EasCommand"));
6
6
  const log_1 = tslib_1.__importDefault(require("../log"));
7
7
  class AnalyticsView extends EasCommand_1.default {
8
+ static description = 'display or change analytics settings';
9
+ static args = [{ name: 'STATUS', options: ['on', 'off'] }];
8
10
  async runAsync() {
9
11
  const { STATUS: status } = (await this.parse(AnalyticsView)).args;
10
12
  if (status) {
@@ -17,6 +19,4 @@ class AnalyticsView extends EasCommand_1.default {
17
19
  }
18
20
  }
19
21
  }
20
- AnalyticsView.description = 'display or change analytics settings';
21
- AnalyticsView.args = [{ name: 'STATUS', options: ['on', 'off'] }];
22
22
  exports.default = AnalyticsView;
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- var _a;
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  const tslib_1 = require("tslib");
5
4
  const chalk_1 = tslib_1.__importDefault(require("chalk"));
@@ -12,9 +11,25 @@ const projectUtils_1 = require("../../project/projectUtils");
12
11
  const prompts_1 = require("../../prompts");
13
12
  const json_1 = require("../../utils/json");
14
13
  class BranchCreate extends EasCommand_1.default {
14
+ static description = 'create a branch';
15
+ static args = [
16
+ {
17
+ name: 'name',
18
+ required: false,
19
+ description: 'Name of the branch to create',
20
+ },
21
+ ];
22
+ static flags = {
23
+ ...flags_1.EasNonInteractiveAndJsonFlags,
24
+ };
25
+ static contextDefinition = {
26
+ ...this.ContextOptions.ProjectId,
27
+ ...this.ContextOptions.LoggedIn,
28
+ ...this.ContextOptions.Vcs,
29
+ };
15
30
  async runAsync() {
16
- let { args: { name }, flags: { json: jsonFlag, 'non-interactive': nonInteractive }, } = await this.parse(_a);
17
- const { projectId, loggedIn: { graphqlClient }, vcsClient, } = await this.getContextAsync(_a, {
31
+ let { args: { name }, flags: { json: jsonFlag, 'non-interactive': nonInteractive }, } = await this.parse(BranchCreate);
32
+ const { projectId, loggedIn: { graphqlClient }, vcsClient, } = await this.getContextAsync(BranchCreate, {
18
33
  nonInteractive,
19
34
  });
20
35
  if (jsonFlag) {
@@ -43,21 +58,4 @@ class BranchCreate extends EasCommand_1.default {
43
58
  }
44
59
  }
45
60
  }
46
- _a = BranchCreate;
47
- BranchCreate.description = 'create a branch';
48
- BranchCreate.args = [
49
- {
50
- name: 'name',
51
- required: false,
52
- description: 'Name of the branch to create',
53
- },
54
- ];
55
- BranchCreate.flags = {
56
- ...flags_1.EasNonInteractiveAndJsonFlags,
57
- };
58
- BranchCreate.contextDefinition = {
59
- ..._a.ContextOptions.ProjectId,
60
- ..._a.ContextOptions.LoggedIn,
61
- ..._a.ContextOptions.Vcs,
62
- };
63
61
  exports.default = BranchCreate;