eas-cli 10.2.4 → 11.0.1

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 (204) hide show
  1. package/README.md +63 -65
  2. package/build/branch/actions/SelectBranch.d.ts +1 -1
  3. package/build/branch/actions/SelectBranch.js +2 -2
  4. package/build/branch/queries.js +3 -1
  5. package/build/build/android/build.js +1 -1
  6. package/build/build/android/version.js +1 -1
  7. package/build/build/build.js +21 -10
  8. package/build/build/context.d.ts +1 -0
  9. package/build/build/createContext.d.ts +2 -1
  10. package/build/build/createContext.js +6 -3
  11. package/build/build/evaluateConfigWithEnvVarsAsync.d.ts +16 -0
  12. package/build/build/evaluateConfigWithEnvVarsAsync.js +44 -0
  13. package/build/build/ios/build.js +4 -4
  14. package/build/build/local.d.ts +1 -1
  15. package/build/build/local.js +2 -1
  16. package/build/build/queries.js +3 -1
  17. package/build/build/runBuildAndSubmit.d.ts +2 -0
  18. package/build/build/runBuildAndSubmit.js +14 -7
  19. package/build/build/utils/printBuildInfo.js +6 -2
  20. package/build/build/validate.js +2 -2
  21. package/build/channel/actions/SelectChannel.d.ts +1 -1
  22. package/build/channel/actions/SelectChannel.js +2 -2
  23. package/build/channel/queries.js +6 -2
  24. package/build/commandUtils/EasCommand.js +2 -2
  25. package/build/commandUtils/context/contextUtils/createGraphqlClient.js +1 -1
  26. package/build/commandUtils/flags.d.ts +3 -0
  27. package/build/commandUtils/flags.js +15 -1
  28. package/build/commandUtils/gating/FeatureGating.js +6 -2
  29. package/build/commands/analytics.js +1 -1
  30. package/build/commands/build/index.d.ts +4 -1
  31. package/build/commands/build/index.js +3 -0
  32. package/build/commands/build/resign.d.ts +4 -1
  33. package/build/commands/build/resign.js +12 -3
  34. package/build/commands/build/version/get.d.ts +1 -0
  35. package/build/commands/build/version/get.js +9 -2
  36. package/build/commands/build/version/set.d.ts +1 -0
  37. package/build/commands/build/version/set.js +11 -1
  38. package/build/commands/build/version/sync.d.ts +1 -0
  39. package/build/commands/build/version/sync.js +13 -5
  40. package/build/commands/config.d.ts +2 -0
  41. package/build/commands/config.js +17 -5
  42. package/build/commands/device/delete.js +1 -1
  43. package/build/commands/device/rename.js +1 -1
  44. package/build/commands/env/create.js +7 -2
  45. package/build/commands/env/delete.js +5 -2
  46. package/build/commands/env/get.js +12 -4
  47. package/build/commands/env/link.js +3 -1
  48. package/build/commands/env/list.d.ts +4 -2
  49. package/build/commands/env/list.js +31 -4
  50. package/build/commands/env/pull.d.ts +15 -0
  51. package/build/commands/env/pull.js +64 -0
  52. package/build/commands/env/push.d.ts +17 -0
  53. package/build/commands/env/push.js +148 -0
  54. package/build/commands/env/unlink.js +4 -1
  55. package/build/commands/env/update.js +7 -2
  56. package/build/commands/metadata/lint.js +4 -2
  57. package/build/commands/project/onboarding.js +1 -1
  58. package/build/commands/update/edit.d.ts +19 -0
  59. package/build/commands/update/edit.js +102 -0
  60. package/build/commands/update/index.d.ts +1 -2
  61. package/build/commands/update/index.js +53 -25
  62. package/build/commands/update/list.js +6 -3
  63. package/build/commands/update/roll-back-to-embedded.js +1 -1
  64. package/build/credentials/android/AndroidCredentialsProvider.d.ts +2 -2
  65. package/build/credentials/android/actions/AssignFcm.d.ts +1 -1
  66. package/build/credentials/android/actions/AssignGoogleServiceAccountKeyForFcmV1.d.ts +1 -1
  67. package/build/credentials/android/actions/AssignGoogleServiceAccountKeyForSubmissions.d.ts +1 -1
  68. package/build/credentials/android/actions/CreateFcm.d.ts +1 -1
  69. package/build/credentials/android/actions/CreateGoogleServiceAccountKey.d.ts +1 -1
  70. package/build/credentials/android/actions/CreateKeystore.d.ts +1 -1
  71. package/build/credentials/android/actions/DownloadKeystore.d.ts +2 -2
  72. package/build/credentials/android/actions/RemoveFcm.d.ts +1 -1
  73. package/build/credentials/android/actions/RemoveGoogleServiceAccountKey.d.ts +2 -2
  74. package/build/credentials/android/actions/RemoveKeystore.d.ts +1 -1
  75. package/build/credentials/android/actions/SetUpBuildCredentials.d.ts +1 -1
  76. package/build/credentials/android/actions/SetUpBuildCredentialsFromCredentialsJson.d.ts +1 -1
  77. package/build/credentials/android/actions/SetUpGoogleServiceAccountKeyForFcmV1.d.ts +1 -1
  78. package/build/credentials/android/actions/SetUpGoogleServiceAccountKeyForSubmissions.d.ts +1 -1
  79. package/build/credentials/android/actions/UseExistingGoogleServiceAccountKey.d.ts +1 -1
  80. package/build/credentials/android/api/GraphqlClient.js +3 -3
  81. package/build/credentials/context.d.ts +2 -2
  82. package/build/credentials/context.js +1 -1
  83. package/build/credentials/ios/IosCredentialsProvider.d.ts +2 -2
  84. package/build/credentials/ios/IosCredentialsProvider.js +1 -1
  85. package/build/credentials/ios/actions/AscApiKeyUtils.js +1 -1
  86. package/build/credentials/ios/actions/AssignAscApiKey.d.ts +1 -1
  87. package/build/credentials/ios/actions/AssignPushKey.d.ts +1 -1
  88. package/build/credentials/ios/actions/ConfigureProvisioningProfile.d.ts +4 -4
  89. package/build/credentials/ios/actions/CreateAscApiKey.d.ts +1 -1
  90. package/build/credentials/ios/actions/CreateDistributionCertificate.d.ts +1 -1
  91. package/build/credentials/ios/actions/CreateProvisioningProfile.d.ts +3 -3
  92. package/build/credentials/ios/actions/CreatePushKey.d.ts +1 -1
  93. package/build/credentials/ios/actions/DistributionCertificateUtils.js +5 -5
  94. package/build/credentials/ios/actions/ProvisioningProfileUtils.js +1 -1
  95. package/build/credentials/ios/actions/PushKeyUtils.js +2 -2
  96. package/build/credentials/ios/actions/RemoveAscApiKey.d.ts +2 -2
  97. package/build/credentials/ios/actions/RemoveDistributionCertificate.d.ts +3 -3
  98. package/build/credentials/ios/actions/RemoveProvisioningProfile.d.ts +2 -2
  99. package/build/credentials/ios/actions/RemovePushKey.d.ts +2 -2
  100. package/build/credentials/ios/actions/SetUpAdhocProvisioningProfile.d.ts +1 -1
  101. package/build/credentials/ios/actions/SetUpAdhocProvisioningProfile.js +1 -1
  102. package/build/credentials/ios/actions/SetUpAscApiKey.d.ts +2 -2
  103. package/build/credentials/ios/actions/SetUpBuildCredentials.d.ts +1 -1
  104. package/build/credentials/ios/actions/SetUpBuildCredentialsFromCredentialsJson.d.ts +3 -3
  105. package/build/credentials/ios/actions/SetUpDistributionCertificate.d.ts +2 -2
  106. package/build/credentials/ios/actions/SetUpDistributionCertificate.js +1 -1
  107. package/build/credentials/ios/actions/SetUpInternalProvisioningProfile.d.ts +1 -1
  108. package/build/credentials/ios/actions/SetUpProvisioningProfile.d.ts +3 -3
  109. package/build/credentials/ios/actions/SetUpProvisioningProfile.js +1 -1
  110. package/build/credentials/ios/actions/SetUpPushKey.d.ts +1 -1
  111. package/build/credentials/ios/actions/SetUpTargetBuildCredentials.d.ts +1 -1
  112. package/build/credentials/ios/actions/SetUpTargetBuildCredentialsFromCredentialsJson.d.ts +3 -3
  113. package/build/credentials/ios/actions/UpdateCredentialsJson.d.ts +3 -3
  114. package/build/credentials/ios/api/GraphqlClient.js +4 -4
  115. package/build/credentials/ios/appstore/AppStoreApi.js +4 -4
  116. package/build/credentials/ios/appstore/authenticate.js +1 -1
  117. package/build/credentials/ios/appstore/bundleId.js +1 -1
  118. package/build/credentials/ios/appstore/bundleIdCapabilities.js +1 -1
  119. package/build/credentials/ios/appstore/ensureAppExists.js +1 -1
  120. package/build/credentials/ios/appstore/keychain.js +8 -6
  121. package/build/credentials/ios/appstore/provisioningProfile.js +1 -1
  122. package/build/credentials/ios/appstore/pushKey.js +1 -1
  123. package/build/credentials/ios/appstore/resolveCredentials.js +2 -2
  124. package/build/credentials/ios/credentials.js +1 -1
  125. package/build/credentials/ios/utils/convertHTMLToASCII.js +1 -1
  126. package/build/credentials/ios/validators/validateProvisioningProfile.js +2 -4
  127. package/build/credentials/manager/CheckBuildProfileFlagAgainstEasJson.d.ts +3 -3
  128. package/build/credentials/manager/CreateAndroidBuildCredentials.d.ts +1 -1
  129. package/build/credentials/manager/ManageAndroid.js +2 -1
  130. package/build/credentials/manager/ManageIos.js +3 -2
  131. package/build/credentials/manager/SelectAndroidBuildCredentials.d.ts +2 -2
  132. package/build/credentials/manager/SelectBuildProfileFromEasJson.d.ts +2 -2
  133. package/build/credentials/manager/SelectIosDistributionTypeGraphqlFromBuildProfile.d.ts +1 -1
  134. package/build/credentials/manager/SelectIosDistributionTypeGraphqlFromBuildProfile.js +1 -1
  135. package/build/credentials/manager/SelectPlatform.js +3 -2
  136. package/build/credentials/manager/SetDefaultAndroidKeystore.d.ts +1 -1
  137. package/build/credentials/manager/SetUpAndroidBuildCredentials.d.ts +1 -1
  138. package/build/credentials/manager/SetUpBuildCredentialsCommandAction.js +3 -2
  139. package/build/credentials/manager/SetUpIosBuildCredentials.d.ts +1 -1
  140. package/build/devices/actions/create/action.d.ts +4 -4
  141. package/build/devices/actions/create/registrationUrlMethod.js +3 -1
  142. package/build/devices/manager.d.ts +4 -4
  143. package/build/devices/queries.js +3 -1
  144. package/build/easMultiselect.js +6 -2
  145. package/build/graphql/generated.d.ts +342 -33
  146. package/build/graphql/generated.js +52 -2
  147. package/build/graphql/mutations/EnvironmentVariableMutation.d.ts +1 -0
  148. package/build/graphql/mutations/EnvironmentVariableMutation.js +20 -0
  149. package/build/graphql/mutations/PublishMutation.d.ts +1 -0
  150. package/build/graphql/mutations/PublishMutation.js +16 -0
  151. package/build/graphql/queries/BranchQuery.d.ts +7 -1
  152. package/build/graphql/queries/BranchQuery.js +42 -0
  153. package/build/graphql/queries/EnvironmentVariablesQuery.d.ts +16 -7
  154. package/build/graphql/queries/EnvironmentVariablesQuery.js +29 -6
  155. package/build/graphql/types/Update.js +4 -0
  156. package/build/metadata/apple/config/reader.js +1 -1
  157. package/build/metadata/apple/tasks/age-rating.js +1 -1
  158. package/build/metadata/apple/tasks/app-review-detail.js +2 -1
  159. package/build/metadata/apple/tasks/app-version.d.ts +1 -1
  160. package/build/metadata/config/resolve.js +2 -1
  161. package/build/metadata/errors.js +2 -1
  162. package/build/metadata/utils/log.js +1 -1
  163. package/build/metadata/utils/retry.js +1 -1
  164. package/build/onboarding/runCommand.js +1 -1
  165. package/build/ora.js +12 -4
  166. package/build/project/android/applicationId.js +1 -1
  167. package/build/project/applicationIdentifier.d.ts +3 -2
  168. package/build/project/applicationIdentifier.js +2 -2
  169. package/build/project/expoConfig.js +2 -2
  170. package/build/project/ios/entitlements.js +1 -1
  171. package/build/project/publish.d.ts +31 -18
  172. package/build/project/publish.js +61 -37
  173. package/build/project/resolveRuntimeVersionAsync.d.ts +4 -1
  174. package/build/project/resolveRuntimeVersionAsync.js +9 -3
  175. package/build/rollout/actions/CreateRollout.d.ts +2 -2
  176. package/build/rollout/actions/EditRollout.d.ts +2 -2
  177. package/build/rollout/actions/EndRollout.d.ts +2 -2
  178. package/build/rollout/actions/ManageRollout.d.ts +2 -2
  179. package/build/rollout/actions/NonInteractiveRollout.d.ts +1 -1
  180. package/build/rollout/actions/RolloutMainMenu.d.ts +1 -1
  181. package/build/rollout/actions/SelectRuntime.d.ts +3 -3
  182. package/build/run/android/adb.js +1 -1
  183. package/build/run/ios/simctl.js +1 -1
  184. package/build/run/ios/systemRequirements.js +1 -1
  185. package/build/submit/ArchiveSource.js +15 -15
  186. package/build/submit/BaseSubmitter.js +2 -2
  187. package/build/submit/submit.js +1 -1
  188. package/build/update/android/UpdatesModule.js +1 -1
  189. package/build/update/configure.d.ts +1 -1
  190. package/build/update/queries.js +8 -3
  191. package/build/update/republish.js +2 -1
  192. package/build/update/utils.d.ts +1 -0
  193. package/build/update/utils.js +7 -0
  194. package/build/user/expoSsoLauncher.js +1 -1
  195. package/build/utils/download.js +2 -2
  196. package/build/utils/filterAsync.js +1 -1
  197. package/build/utils/image.js +2 -2
  198. package/build/utils/progress.js +1 -1
  199. package/build/utils/promise.js +1 -1
  200. package/build/utils/queries.js +2 -2
  201. package/build/vcs/clients/git.d.ts +1 -1
  202. package/build/vcs/local.d.ts +1 -1
  203. package/oclif.manifest.json +218 -22
  204. package/package.json +14 -14
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tslib_1 = require("tslib");
5
+ const core_1 = require("@oclif/core");
6
+ const dotenv_1 = tslib_1.__importDefault(require("dotenv"));
7
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
8
+ const EasCommand_1 = tslib_1.__importDefault(require("../../commandUtils/EasCommand"));
9
+ const flags_1 = require("../../commandUtils/flags");
10
+ const generated_1 = require("../../graphql/generated");
11
+ const EnvironmentVariableMutation_1 = require("../../graphql/mutations/EnvironmentVariableMutation");
12
+ const EnvironmentVariablesQuery_1 = require("../../graphql/queries/EnvironmentVariablesQuery");
13
+ const log_1 = tslib_1.__importDefault(require("../../log"));
14
+ const prompts_1 = require("../../prompts");
15
+ class EnvironmentVariablePush extends EasCommand_1.default {
16
+ async runAsync() {
17
+ const { flags } = await this.parse(_a);
18
+ const { environment, path: envPath } = this.validateFlags(flags);
19
+ const { privateProjectConfig: { projectId }, loggedIn: { graphqlClient }, } = await this.getContextAsync(_a, {
20
+ nonInteractive: false,
21
+ });
22
+ const updateVariables = await this.parseEnvFileAsync(envPath, environment);
23
+ const variableNames = Object.keys(updateVariables);
24
+ const existingVariables = await EnvironmentVariablesQuery_1.EnvironmentVariablesQuery.byAppIdAsync(graphqlClient, {
25
+ appId: projectId,
26
+ environment,
27
+ filterNames: variableNames,
28
+ });
29
+ const existingDifferentVariables = [];
30
+ // Remove variables that are the same as the ones in the environment
31
+ existingVariables.forEach(variable => {
32
+ const existingVariableUpdate = updateVariables[variable.name];
33
+ if (existingVariableUpdate && existingVariableUpdate.value !== variable.value) {
34
+ existingDifferentVariables.push(variable);
35
+ }
36
+ else {
37
+ delete updateVariables[variable.name];
38
+ }
39
+ });
40
+ const existingDifferentSharedVariables = existingDifferentVariables.filter(variable => variable.scope === generated_1.EnvironmentVariableScope.Shared);
41
+ if (existingDifferentSharedVariables.length > 0) {
42
+ const existingDifferentSharedVariablesNames = existingDifferentSharedVariables.map(variable => variable.name);
43
+ log_1.default.error('Shared variables cannot be overwritten by eas env:push command.');
44
+ log_1.default.error('Remove them from the env file or unlink them from the project to continue:');
45
+ existingDifferentSharedVariablesNames.forEach(name => {
46
+ log_1.default.error(`- ${name}`);
47
+ });
48
+ throw new Error('Shared variables cannot be overwritten by eas env:push command');
49
+ }
50
+ if (existingDifferentVariables.length > 0) {
51
+ log_1.default.warn('Some variables already exist in the environment.');
52
+ const variableNames = existingDifferentVariables.map(variable => variable.name);
53
+ const confirmationMessage = variableNames.length > 1
54
+ ? `The ${variableNames.join(', ')} environment variables already exist in ${environment} environment. Do you want to override them all?`
55
+ : `The ${variableNames[0]} environment variable already exists in ${environment} environment. Do you want to override it?`;
56
+ const confirm = await (0, prompts_1.confirmAsync)({
57
+ message: confirmationMessage,
58
+ });
59
+ let variablesToOverwrite = [];
60
+ if (!confirm && existingDifferentVariables.length === 1) {
61
+ throw new Error('No new variables to push.');
62
+ }
63
+ if (confirm) {
64
+ variablesToOverwrite = existingDifferentVariables.map(variable => variable.name);
65
+ }
66
+ else {
67
+ const promptResult = await (0, prompts_1.promptAsync)({
68
+ type: 'multiselect',
69
+ name: 'variablesToOverwrite',
70
+ message: 'Select variables to overwrite:',
71
+ // @ts-expect-error property missing from `@types/prompts`
72
+ optionsPerPage: 20,
73
+ choices: existingDifferentVariables.map(variable => ({
74
+ title: `${variable.name}: ${updateVariables[variable.name].value} (was ${variable.value ?? '(secret)'})`,
75
+ value: variable.name,
76
+ })),
77
+ });
78
+ variablesToOverwrite = promptResult.variablesToOverwrite;
79
+ }
80
+ for (const existingVariable of existingVariables) {
81
+ const name = existingVariable.name;
82
+ if (variablesToOverwrite.includes(name)) {
83
+ updateVariables[name]['overwrite'] = true;
84
+ }
85
+ else {
86
+ delete updateVariables[name];
87
+ }
88
+ }
89
+ }
90
+ // Check if any of the sensitive variables already exist in the environment. Prompt the user to overwrite them.
91
+ const existingSensitiveVariables = existingVariables.filter(variable => variable.value === null);
92
+ if (existingSensitiveVariables.length > 0) {
93
+ const existingSensitiveVariablesNames = existingSensitiveVariables.map(variable => `- ${variable.name}`);
94
+ const confirm = await (0, prompts_1.confirmAsync)({
95
+ message: `You are about to overwrite sensitive variables.\n${existingSensitiveVariablesNames.join('\n')}\n Do you want to continue?`,
96
+ });
97
+ if (!confirm) {
98
+ throw new Error('Aborting...');
99
+ }
100
+ }
101
+ const variablesToPush = Object.values(updateVariables);
102
+ if (variablesToPush.length === 0) {
103
+ log_1.default.log('No new variables to push.');
104
+ return;
105
+ }
106
+ await EnvironmentVariableMutation_1.EnvironmentVariableMutation.createBulkEnvironmentVariablesForAppAsync(graphqlClient, variablesToPush, projectId);
107
+ log_1.default.log(`Uploaded env file to ${environment} environment.`);
108
+ }
109
+ async parseEnvFileAsync(envPath, environment) {
110
+ if (!(await fs_extra_1.default.exists(envPath))) {
111
+ throw new Error(`File ${envPath} does not exist.`);
112
+ }
113
+ const pushInput = {};
114
+ const variables = dotenv_1.default.parse(await fs_extra_1.default.readFile(envPath, 'utf8'));
115
+ for (const [name, value] of Object.entries(variables)) {
116
+ pushInput[name] = {
117
+ name,
118
+ value,
119
+ environment,
120
+ visibility: name.startsWith('EXPO_SENSITIVE')
121
+ ? generated_1.EnvironmentVariableVisibility.Sensitive
122
+ : generated_1.EnvironmentVariableVisibility.Public,
123
+ };
124
+ }
125
+ return pushInput;
126
+ }
127
+ validateFlags(flags) {
128
+ if (!flags.environment) {
129
+ throw new Error('Please provide an environment to push the env file to.');
130
+ }
131
+ return { ...flags, environment: flags.environment };
132
+ }
133
+ }
134
+ _a = EnvironmentVariablePush;
135
+ EnvironmentVariablePush.description = 'push env file';
136
+ EnvironmentVariablePush.hidden = true;
137
+ EnvironmentVariablePush.contextDefinition = {
138
+ ..._a.ContextOptions.ProjectConfig,
139
+ ..._a.ContextOptions.LoggedIn,
140
+ };
141
+ EnvironmentVariablePush.flags = {
142
+ ...flags_1.EASEnvironmentFlag,
143
+ path: core_1.Flags.string({
144
+ description: 'Path to the input `.env` file',
145
+ default: '.env.local',
146
+ }),
147
+ };
148
+ exports.default = EnvironmentVariablePush;
@@ -23,7 +23,10 @@ class EnvironmentVariableUnlink extends EasCommand_1.default {
23
23
  environment = await (0, prompts_2.promptVariableEnvironmentAsync)(nonInteractive);
24
24
  }
25
25
  const projectDisplayName = await (0, projectUtils_1.getDisplayNameForProjectIdAsync)(graphqlClient, projectId);
26
- const appVariables = await EnvironmentVariablesQuery_1.EnvironmentVariablesQuery.byAppIdAsync(graphqlClient, projectId, environment);
26
+ const appVariables = await EnvironmentVariablesQuery_1.EnvironmentVariablesQuery.byAppIdAsync(graphqlClient, {
27
+ appId: projectId,
28
+ environment,
29
+ });
27
30
  const linkedVariables = appVariables.filter(({ scope }) => scope === generated_1.EnvironmentVariableScope.Shared);
28
31
  if (linkedVariables.length === 0) {
29
32
  throw new Error(`There are no linked shared env variables for project ${projectDisplayName}`);
@@ -28,7 +28,10 @@ class EnvironmentVariableUpdate extends EasCommand_1.default {
28
28
  if (!environment) {
29
29
  environment = await (0, prompts_2.promptVariableEnvironmentAsync)(nonInteractive);
30
30
  }
31
- const existingVariables = await EnvironmentVariablesQuery_1.EnvironmentVariablesQuery.byAppIdAsync(graphqlClient, projectId, environment);
31
+ const existingVariables = await EnvironmentVariablesQuery_1.EnvironmentVariablesQuery.byAppIdAsync(graphqlClient, {
32
+ appId: projectId,
33
+ environment,
34
+ });
32
35
  if (!name) {
33
36
  name = await (0, prompts_1.selectAsync)('Select variable', existingVariables.map(variable => ({
34
37
  title: variable.name,
@@ -62,7 +65,9 @@ class EnvironmentVariableUpdate extends EasCommand_1.default {
62
65
  log_1.default.withTick(`Updated variable ${chalk_1.default.bold(name)} on project ${chalk_1.default.bold(projectDisplayName)}.`);
63
66
  }
64
67
  else if (scope === generated_1.EnvironmentVariableScope.Shared) {
65
- const sharedVariables = await EnvironmentVariablesQuery_1.EnvironmentVariablesQuery.sharedAsync(graphqlClient, projectId);
68
+ const sharedVariables = await EnvironmentVariablesQuery_1.EnvironmentVariablesQuery.sharedAsync(graphqlClient, {
69
+ appId: projectId,
70
+ });
66
71
  if (!name) {
67
72
  name = await (0, prompts_1.selectAsync)('Select variable', sharedVariables.map(variable => ({
68
73
  title: variable.name,
@@ -37,7 +37,8 @@ class MetadataLint extends EasCommand_1.default {
37
37
  try {
38
38
  await (0, resolve_1.loadConfigAsync)({ projectDir, profile: submitProfile });
39
39
  if (flags.json) {
40
- return (0, json_1.printJsonOnlyOutput)([]);
40
+ (0, json_1.printJsonOnlyOutput)([]);
41
+ return;
41
42
  }
42
43
  log_1.default.log('✅ Store configuration is valid.');
43
44
  }
@@ -46,7 +47,8 @@ class MetadataLint extends EasCommand_1.default {
46
47
  throw error;
47
48
  }
48
49
  if (flags.json) {
49
- return (0, json_1.printJsonOnlyOutput)(error.errors);
50
+ (0, json_1.printJsonOnlyOutput)(error.errors);
51
+ return;
50
52
  }
51
53
  (0, errors_1.logMetadataValidationError)(error);
52
54
  log_1.default.addNewLineIfNone();
@@ -187,7 +187,7 @@ class Onboarding extends EasCommand_1.default {
187
187
  log_1.default.log();
188
188
  log_1.default.log('🎉 We finished configuring your project.');
189
189
  log_1.default.log();
190
- if (app.githubRepository ||
190
+ if (!!app.githubRepository ||
191
191
  actor.preferences.onboarding.environment === generated_1.OnboardingEnvironment.ExpoGo) {
192
192
  log_1.default.log('🚀 You can now go back to the website to continue:');
193
193
  const url = new URL(`/onboarding/develop/set-up-project-on-your-machine?project=${app.slug}&accountId=${app.ownerAccount.id}`, (0, api_1.getExpoWebsiteBaseUrl)()).toString();
@@ -0,0 +1,19 @@
1
+ import EasCommand from '../../commandUtils/EasCommand';
2
+ export default class UpdateEdit extends EasCommand {
3
+ static description: string;
4
+ static hidden: boolean;
5
+ static args: {
6
+ name: string;
7
+ required: boolean;
8
+ description: string;
9
+ }[];
10
+ static flags: {
11
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
12
+ 'non-interactive': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
13
+ 'rollout-percentage': import("@oclif/core/lib/interfaces").OptionFlag<number | undefined>;
14
+ };
15
+ static contextDefinition: {
16
+ loggedIn: import("../../commandUtils/context/LoggedInContextField").default;
17
+ };
18
+ runAsync(): Promise<void>;
19
+ }
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tslib_1 = require("tslib");
5
+ const core_1 = require("@oclif/core");
6
+ const assert_1 = tslib_1.__importDefault(require("assert"));
7
+ const chalk_1 = tslib_1.__importDefault(require("chalk"));
8
+ const EasCommand_1 = tslib_1.__importDefault(require("../../commandUtils/EasCommand"));
9
+ const flags_1 = require("../../commandUtils/flags");
10
+ const PublishMutation_1 = require("../../graphql/mutations/PublishMutation");
11
+ const UpdateQuery_1 = require("../../graphql/queries/UpdateQuery");
12
+ const log_1 = tslib_1.__importDefault(require("../../log"));
13
+ const prompts_1 = require("../../prompts");
14
+ const utils_1 = require("../../update/utils");
15
+ const json_1 = require("../../utils/json");
16
+ class UpdateEdit extends EasCommand_1.default {
17
+ async runAsync() {
18
+ const { args: { groupId }, flags: { 'rollout-percentage': rolloutPercentage, json: jsonFlag, 'non-interactive': nonInteractive, }, } = await this.parse(_a);
19
+ const { loggedIn: { graphqlClient }, } = await this.getContextAsync(_a, { nonInteractive });
20
+ if (jsonFlag) {
21
+ (0, json_1.enableJsonOutput)();
22
+ }
23
+ const proposedUpdatesToEdit = (await UpdateQuery_1.UpdateQuery.viewUpdateGroupAsync(graphqlClient, { groupId })).map(u => ({ updateId: u.id, rolloutPercentage: u.rolloutPercentage }));
24
+ const updatesToEdit = proposedUpdatesToEdit.filter((u) => u.rolloutPercentage !== null && u.rolloutPercentage !== undefined);
25
+ if (updatesToEdit.length === 0) {
26
+ throw new Error('Cannot edit rollout percentage on update group that is not a rollout.');
27
+ }
28
+ const rolloutPercentagesSet = new Set(updatesToEdit.map(u => u.rolloutPercentage));
29
+ if (rolloutPercentagesSet.size !== 1) {
30
+ throw new Error('Cannot edit rollout percentage for a group with non-equal percentages for updates in the group.');
31
+ }
32
+ const previousPercentage = updatesToEdit[0].rolloutPercentage;
33
+ if (nonInteractive && rolloutPercentage === undefined) {
34
+ throw new Error('Must specify --rollout-percentage in non-interactive mode');
35
+ }
36
+ let rolloutPercentageToSet = rolloutPercentage;
37
+ if (rolloutPercentageToSet === undefined) {
38
+ const { percentage } = await (0, prompts_1.promptAsync)({
39
+ type: 'number',
40
+ message: `New rollout percentage (min: ${previousPercentage}, max: 100)`,
41
+ validate: value => {
42
+ if (value <= previousPercentage) {
43
+ return `Rollout percentage must be greater than previous rollout percentage (${previousPercentage})`;
44
+ }
45
+ else if (value > 100) {
46
+ return `Rollout percentage must not be greater than 100`;
47
+ }
48
+ else {
49
+ return true;
50
+ }
51
+ },
52
+ name: 'percentage',
53
+ });
54
+ if (!percentage) {
55
+ log_1.default.log('Aborted.');
56
+ return;
57
+ }
58
+ rolloutPercentageToSet = percentage;
59
+ }
60
+ (0, assert_1.default)(rolloutPercentageToSet !== undefined);
61
+ if (rolloutPercentageToSet < previousPercentage) {
62
+ throw new Error(`Rollout percentage must be greater than previous rollout percentage (${previousPercentage})`);
63
+ }
64
+ else if (rolloutPercentageToSet > 100) {
65
+ throw new Error('Rollout percentage must not be greater than 100');
66
+ }
67
+ const updatedUpdates = await Promise.all(updatesToEdit.map(async (u) => {
68
+ return await PublishMutation_1.PublishMutation.setRolloutPercentageAsync(graphqlClient, u.updateId, rolloutPercentageToSet);
69
+ }));
70
+ if (jsonFlag) {
71
+ (0, json_1.printJsonOnlyOutput)((0, utils_1.getUpdateJsonInfosForUpdates)(updatedUpdates));
72
+ }
73
+ else {
74
+ const [updateGroupDescription] = (0, utils_1.getUpdateGroupDescriptions)([updatedUpdates]);
75
+ log_1.default.log(chalk_1.default.bold('Update group:'));
76
+ log_1.default.log((0, utils_1.formatUpdateGroup)(updateGroupDescription));
77
+ }
78
+ }
79
+ }
80
+ _a = UpdateEdit;
81
+ UpdateEdit.description = 'edit all the updates in an update group';
82
+ UpdateEdit.hidden = true;
83
+ UpdateEdit.args = [
84
+ {
85
+ name: 'groupId',
86
+ required: true,
87
+ description: 'The ID of an update group to edit.',
88
+ },
89
+ ];
90
+ UpdateEdit.flags = {
91
+ 'rollout-percentage': core_1.Flags.integer({
92
+ description: `Rollout percentage to set for a rollout update. The specified number must be an integer between 1 and 100.`,
93
+ required: false,
94
+ min: 0,
95
+ max: 100,
96
+ }),
97
+ ...flags_1.EasNonInteractiveAndJsonFlags,
98
+ };
99
+ UpdateEdit.contextDefinition = {
100
+ ..._a.ContextOptions.LoggedIn,
101
+ };
102
+ exports.default = UpdateEdit;
@@ -7,12 +7,11 @@ export default class UpdatePublish extends EasCommand {
7
7
  branch: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
8
8
  channel: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
9
9
  message: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
10
- republish: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
- group: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
12
10
  'input-dir': import("@oclif/core/lib/interfaces").OptionFlag<string>;
13
11
  'skip-bundler': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
12
  'clear-cache': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
15
13
  'emit-metadata': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ 'rollout-percentage': import("@oclif/core/lib/interfaces").OptionFlag<number | undefined>;
16
15
  platform: import("@oclif/core/lib/interfaces").OptionFlag<string>;
17
16
  auto: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
18
17
  'private-key-path': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
@@ -32,7 +32,7 @@ class UpdatePublish extends EasCommand_1.default {
32
32
  async runAsync() {
33
33
  const { flags: rawFlags } = await this.parse(_a);
34
34
  const paginatedQueryOptions = (0, pagination_1.getPaginatedQueryOptions)(rawFlags);
35
- const { auto: autoFlag, platform: platformFlag, channelName: channelNameArg, updateMessage: updateMessageArg, inputDir, skipBundler, clearCache, privateKeyPath, json: jsonFlag, nonInteractive, branchName: branchNameArg, emitMetadata, } = this.sanitizeFlags(rawFlags);
35
+ const { auto: autoFlag, platform: requestedPlatform, channelName: channelNameArg, updateMessage: updateMessageArg, inputDir, skipBundler, clearCache, privateKeyPath, json: jsonFlag, nonInteractive, branchName: branchNameArg, emitMetadata, rolloutPercentage, } = this.sanitizeFlags(rawFlags);
36
36
  const { getDynamicPublicProjectConfigAsync, getDynamicPrivateProjectConfigAsync, loggedIn: { graphqlClient }, vcsClient, } = await this.getContextAsync(_a, {
37
37
  nonInteractive,
38
38
  });
@@ -45,7 +45,7 @@ class UpdatePublish extends EasCommand_1.default {
45
45
  await (0, statuspageService_1.maybeWarnAboutEasOutagesAsync)(graphqlClient, [generated_1.StatuspageServiceName.EasUpdate]);
46
46
  await (0, configure_1.ensureEASUpdateIsConfiguredAsync)({
47
47
  exp: expPossiblyWithoutEasUpdateConfigured,
48
- platform: (0, publish_1.getRequestedPlatform)(platformFlag),
48
+ platform: requestedPlatform,
49
49
  projectDir,
50
50
  projectId,
51
51
  vcsClient,
@@ -74,7 +74,13 @@ class UpdatePublish extends EasCommand_1.default {
74
74
  if (!skipBundler) {
75
75
  const bundleSpinner = (0, ora_1.ora)().start('Exporting...');
76
76
  try {
77
- await (0, publish_1.buildBundlesAsync)({ projectDir, inputDir, exp, platformFlag, clearCache });
77
+ await (0, publish_1.buildBundlesAsync)({
78
+ projectDir,
79
+ inputDir,
80
+ exp,
81
+ platformFlag: requestedPlatform,
82
+ clearCache,
83
+ });
78
84
  bundleSpinner.succeed('Exported bundle(s)');
79
85
  }
80
86
  catch (e) {
@@ -91,7 +97,7 @@ class UpdatePublish extends EasCommand_1.default {
91
97
  let realizedPlatforms = [];
92
98
  try {
93
99
  const collectedAssets = await (0, publish_1.collectAssetsAsync)(distRoot);
94
- const assets = (0, publish_1.filterExportedPlatformsByFlag)(collectedAssets, platformFlag);
100
+ const assets = (0, publish_1.filterCollectedAssetsByRequestedPlatforms)(collectedAssets, requestedPlatform);
95
101
  realizedPlatforms = Object.keys(assets);
96
102
  // Timeout mechanism:
97
103
  // - Start with NO_ACTIVITY_TIMEOUT. 180 seconds is chosen because the cloud function that processes
@@ -161,7 +167,7 @@ class UpdatePublish extends EasCommand_1.default {
161
167
  for (const uploadedAssetPath of uploadResults.uniqueUploadedAssetPaths) {
162
168
  log_1.default.debug(chalk_1.default.dim(`- ${uploadedAssetPath}`));
163
169
  }
164
- const platformString = Object.keys(assets)
170
+ const platformString = realizedPlatforms
165
171
  .map(platform => {
166
172
  const collectedAssetForPlatform = (0, nullthrows_1.default)(assets[platform]);
167
173
  const totalAssetsForPlatform = collectedAssetForPlatform.assets.length + 1; // launch asset
@@ -191,6 +197,14 @@ class UpdatePublish extends EasCommand_1.default {
191
197
  appId: projectId,
192
198
  branchName,
193
199
  });
200
+ const runtimeVersionToRolloutInfoGroup = rolloutPercentage !== undefined
201
+ ? await (0, publish_1.getRuntimeToUpdateRolloutInfoGroupMappingAsync)(graphqlClient, {
202
+ appId: projectId,
203
+ branchName,
204
+ rolloutPercentage,
205
+ runtimeToPlatformMapping,
206
+ })
207
+ : undefined;
194
208
  const gitCommitHash = await vcsClient.getCommitHashAsync();
195
209
  const isGitWorkingTreeDirty = await vcsClient.hasUncommittedChangesAsync();
196
210
  // Sort the updates into different groups based on their platform specific runtime versions
@@ -199,9 +213,19 @@ class UpdatePublish extends EasCommand_1.default {
199
213
  platform,
200
214
  unsortedUpdateInfoGroups[platform],
201
215
  ]));
216
+ const rolloutInfoGroupForRuntimeVersion = runtimeVersionToRolloutInfoGroup
217
+ ? runtimeVersionToRolloutInfoGroup.get(runtimeVersion)
218
+ : null;
219
+ const localRolloutInfoGroup = rolloutInfoGroupForRuntimeVersion
220
+ ? Object.fromEntries(platforms.map(platform => [
221
+ platform,
222
+ rolloutInfoGroupForRuntimeVersion[platform],
223
+ ]))
224
+ : null;
202
225
  return {
203
226
  branchId,
204
227
  updateInfoGroup: localUpdateInfoGroup,
228
+ rolloutInfoGroup: localRolloutInfoGroup,
205
229
  runtimeVersion,
206
230
  message: updateMessage,
207
231
  gitCommitHash,
@@ -281,6 +305,22 @@ class UpdatePublish extends EasCommand_1.default {
281
305
  ? [{ label: 'Android update ID', value: newAndroidUpdate.id }]
282
306
  : []),
283
307
  ...(newIosUpdate ? [{ label: 'iOS update ID', value: newIosUpdate.id }] : []),
308
+ ...(newAndroidUpdate?.rolloutControlUpdate
309
+ ? [
310
+ {
311
+ label: 'Android Rollout',
312
+ value: `${newAndroidUpdate.rolloutPercentage}% (Base update ID: ${newAndroidUpdate.rolloutControlUpdate.id})`,
313
+ },
314
+ ]
315
+ : []),
316
+ ...(newIosUpdate?.rolloutControlUpdate
317
+ ? [
318
+ {
319
+ label: 'iOS Rollout',
320
+ value: `${newIosUpdate.rolloutPercentage}% (Base update ID: ${newIosUpdate.rolloutControlUpdate.id})`,
321
+ },
322
+ ]
323
+ : []),
284
324
  { label: 'Message', value: updateMessage ?? '' },
285
325
  ...(gitCommitHash
286
326
  ? [
@@ -310,18 +350,6 @@ class UpdatePublish extends EasCommand_1.default {
310
350
  if (nonInteractive && !auto && !(updateMessage && (branchName || channelName))) {
311
351
  core_1.Errors.error('--branch and --message, or --channel and --message are required when updating in non-interactive mode unless --auto is specified', { exit: 1 });
312
352
  }
313
- if (flags.group || flags.republish) {
314
- // Pick the first flag set that is defined, in this specific order
315
- const args = [
316
- ['--group', flags.group],
317
- ['--branch', flags.branch],
318
- ].filter(([_, value]) => value)[0];
319
- log_1.default.newLine();
320
- log_1.default.warn('The --group and --republish flags are deprecated, use the republish command instead:');
321
- log_1.default.warn(` ${chalk_1.default.bold([`eas update:republish`, ...(args ?? [])].join(' '))}`);
322
- log_1.default.newLine();
323
- core_1.Errors.error('--group and --republish flags are deprecated', { exit: 1 });
324
- }
325
353
  const skipBundler = flags['skip-bundler'] ?? false;
326
354
  let emitMetadata = flags['emit-metadata'] ?? false;
327
355
  if (skipBundler && emitMetadata) {
@@ -338,6 +366,7 @@ class UpdatePublish extends EasCommand_1.default {
338
366
  clearCache: flags['clear-cache'],
339
367
  platform: flags.platform,
340
368
  privateKeyPath: flags['private-key-path'],
369
+ rolloutPercentage: flags['rollout-percentage'],
341
370
  nonInteractive,
342
371
  emitMetadata,
343
372
  json: flags.json ?? false,
@@ -360,14 +389,6 @@ UpdatePublish.flags = {
360
389
  description: 'A short message describing the update',
361
390
  required: false,
362
391
  }),
363
- republish: core_1.Flags.boolean({
364
- description: 'Republish an update group (deprecated, see republish command)',
365
- exclusive: ['input-dir', 'skip-bundler'],
366
- }),
367
- group: core_1.Flags.string({
368
- description: 'Update group to republish (deprecated, see republish command)',
369
- exclusive: ['input-dir', 'skip-bundler'],
370
- }),
371
392
  'input-dir': core_1.Flags.string({
372
393
  description: 'Location of the bundle',
373
394
  default: 'dist',
@@ -385,6 +406,13 @@ UpdatePublish.flags = {
385
406
  description: `Emit "eas-update-metadata.json" in the bundle folder with detailed information about the generated updates`,
386
407
  default: false,
387
408
  }),
409
+ 'rollout-percentage': core_1.Flags.integer({
410
+ description: `Percentage of users this update should be immediately available to. Users not in the rollout will be served the previous latest update on the branch, even if that update is itself being rolled out. The specified number must be an integer between 1 and 100. When not specified, this defaults to 100.`,
411
+ required: false,
412
+ hidden: true,
413
+ min: 0,
414
+ max: 100,
415
+ }),
388
416
  platform: core_1.Flags.enum({
389
417
  char: 'p',
390
418
  options: [
@@ -21,11 +21,14 @@ class UpdateList extends EasCommand_1.default {
21
21
  (0, json_1.enableJsonOutput)();
22
22
  }
23
23
  if (all) {
24
- (0, queries_2.listAndRenderUpdateGroupsOnAppAsync)(graphqlClient, { projectId, paginatedQueryOptions });
24
+ await (0, queries_2.listAndRenderUpdateGroupsOnAppAsync)(graphqlClient, {
25
+ projectId,
26
+ paginatedQueryOptions,
27
+ });
25
28
  }
26
29
  else {
27
30
  if (branchFlag) {
28
- (0, queries_2.listAndRenderUpdateGroupsOnBranchAsync)(graphqlClient, {
31
+ await (0, queries_2.listAndRenderUpdateGroupsOnBranchAsync)(graphqlClient, {
29
32
  projectId,
30
33
  branchName: branchFlag,
31
34
  paginatedQueryOptions,
@@ -50,7 +53,7 @@ class UpdateList extends EasCommand_1.default {
50
53
  offset: 0,
51
54
  },
52
55
  });
53
- (0, queries_2.listAndRenderUpdateGroupsOnBranchAsync)(graphqlClient, {
56
+ await (0, queries_2.listAndRenderUpdateGroupsOnBranchAsync)(graphqlClient, {
54
57
  projectId,
55
58
  branchName: selectedBranch.name,
56
59
  paginatedQueryOptions,
@@ -40,7 +40,7 @@ class UpdateRollBackToEmbedded extends EasCommand_1.default {
40
40
  await (0, statuspageService_1.maybeWarnAboutEasOutagesAsync)(graphqlClient, [generated_1.StatuspageServiceName.EasUpdate]);
41
41
  await (0, configure_1.ensureEASUpdateIsConfiguredAsync)({
42
42
  exp: expPossiblyWithoutEasUpdateConfigured,
43
- platform: (0, publish_1.getRequestedPlatform)(platformFlag),
43
+ platform: platformFlag,
44
44
  projectDir,
45
45
  projectId,
46
46
  vcsClient,
@@ -10,8 +10,8 @@ interface Options {
10
10
  app: AppLookupParams;
11
11
  }
12
12
  export default class AndroidCredentialsProvider {
13
- private ctx;
14
- private options;
13
+ private readonly ctx;
14
+ private readonly options;
15
15
  readonly platform = Platform.ANDROID;
16
16
  constructor(ctx: CredentialsContext, options: Options);
17
17
  getCredentialsAsync(src: CredentialsSource.LOCAL | CredentialsSource.REMOTE): Promise<AndroidCredentials>;
@@ -2,7 +2,7 @@ import { AndroidFcmFragment, CommonAndroidAppCredentialsFragment } from '../../.
2
2
  import { CredentialsContext } from '../../context';
3
3
  import { AppLookupParams } from '../api/GraphqlClient';
4
4
  export declare class AssignFcm {
5
- private app;
5
+ private readonly app;
6
6
  constructor(app: AppLookupParams);
7
7
  runAsync(ctx: CredentialsContext, fcm: AndroidFcmFragment): Promise<CommonAndroidAppCredentialsFragment>;
8
8
  }
@@ -2,7 +2,7 @@ import { CommonAndroidAppCredentialsFragment, GoogleServiceAccountKeyFragment }
2
2
  import { CredentialsContext } from '../../context';
3
3
  import { AppLookupParams } from '../api/GraphqlClient';
4
4
  export declare class AssignGoogleServiceAccountKeyForFcmV1 {
5
- private app;
5
+ private readonly app;
6
6
  constructor(app: AppLookupParams);
7
7
  runAsync(ctx: CredentialsContext, googleServiceAccountKey: GoogleServiceAccountKeyFragment): Promise<CommonAndroidAppCredentialsFragment>;
8
8
  }
@@ -2,7 +2,7 @@ import { CommonAndroidAppCredentialsFragment, GoogleServiceAccountKeyFragment }
2
2
  import { CredentialsContext } from '../../context';
3
3
  import { AppLookupParams } from '../api/GraphqlClient';
4
4
  export declare class AssignGoogleServiceAccountKeyForSubmissions {
5
- private app;
5
+ private readonly app;
6
6
  constructor(app: AppLookupParams);
7
7
  runAsync(ctx: CredentialsContext, googleServiceAccountKey: GoogleServiceAccountKeyFragment): Promise<CommonAndroidAppCredentialsFragment>;
8
8
  }
@@ -1,7 +1,7 @@
1
1
  import { AccountFragment, AndroidFcmFragment } from '../../../graphql/generated';
2
2
  import { CredentialsContext } from '../../context';
3
3
  export declare class CreateFcm {
4
- private account;
4
+ private readonly account;
5
5
  constructor(account: AccountFragment);
6
6
  runAsync(ctx: CredentialsContext): Promise<AndroidFcmFragment>;
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import { AccountFragment, GoogleServiceAccountKeyFragment } from '../../../graphql/generated';
2
2
  import { CredentialsContext } from '../../context';
3
3
  export declare class CreateGoogleServiceAccountKey {
4
- private account;
4
+ private readonly account;
5
5
  constructor(account: AccountFragment);
6
6
  runAsync(ctx: CredentialsContext): Promise<GoogleServiceAccountKeyFragment>;
7
7
  private provideAsync;
@@ -1,7 +1,7 @@
1
1
  import { AccountFragment, AndroidKeystoreFragment } from '../../../graphql/generated';
2
2
  import { CredentialsContext } from '../../context';
3
3
  export declare class CreateKeystore {
4
- private account;
4
+ private readonly account;
5
5
  constructor(account: AccountFragment);
6
6
  runAsync(ctx: CredentialsContext): Promise<AndroidKeystoreFragment>;
7
7
  private provideOrGenerateAsync;
@@ -7,12 +7,12 @@ interface DownloadKeystoreOptions {
7
7
  outputPath?: string;
8
8
  }
9
9
  export declare class DownloadKeystore {
10
- private options;
10
+ private readonly options;
11
11
  constructor(options: DownloadKeystoreOptions);
12
12
  runAsync(ctx: CredentialsContext, buildCredentials: AndroidAppBuildCredentialsFragment): Promise<void>;
13
13
  }
14
14
  export declare class BackupKeystore {
15
- private app;
15
+ private readonly app;
16
16
  constructor(app: AppLookupParams);
17
17
  runAsync(ctx: CredentialsContext, buildCredentials: AndroidAppBuildCredentialsFragment): Promise<void>;
18
18
  }
@@ -1,7 +1,7 @@
1
1
  import { CredentialsContext } from '../../context';
2
2
  import { AppLookupParams } from '../api/GraphqlClient';
3
3
  export declare class RemoveFcm {
4
- private app;
4
+ private readonly app;
5
5
  constructor(app: AppLookupParams);
6
6
  runAsync(ctx: CredentialsContext): Promise<void>;
7
7
  }