eas-cli 10.2.3 → 11.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 (216) 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 +3 -2
  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 +16 -0
  27. package/build/commandUtils/flags.js +61 -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 +10 -3
  42. package/build/commands/device/delete.js +1 -1
  43. package/build/commands/device/rename.js +1 -1
  44. package/build/commands/env/create.d.ts +23 -0
  45. package/build/commands/env/create.js +169 -0
  46. package/build/commands/env/delete.d.ts +18 -0
  47. package/build/commands/env/delete.js +95 -0
  48. package/build/commands/env/get.d.ts +19 -0
  49. package/build/commands/env/get.js +100 -0
  50. package/build/commands/env/link.d.ts +15 -0
  51. package/build/commands/env/link.js +59 -0
  52. package/build/commands/env/list.d.ts +18 -0
  53. package/build/commands/env/list.js +82 -0
  54. package/build/commands/env/pull.d.ts +15 -0
  55. package/build/commands/env/pull.js +64 -0
  56. package/build/commands/env/push.d.ts +17 -0
  57. package/build/commands/env/push.js +148 -0
  58. package/build/commands/env/unlink.d.ts +15 -0
  59. package/build/commands/env/unlink.js +65 -0
  60. package/build/commands/env/update.d.ts +21 -0
  61. package/build/commands/env/update.js +135 -0
  62. package/build/commands/metadata/lint.js +4 -2
  63. package/build/commands/project/onboarding.js +1 -1
  64. package/build/commands/update/edit.d.ts +19 -0
  65. package/build/commands/update/edit.js +102 -0
  66. package/build/commands/update/index.d.ts +1 -2
  67. package/build/commands/update/index.js +53 -25
  68. package/build/commands/update/list.js +6 -3
  69. package/build/commands/update/roll-back-to-embedded.js +1 -1
  70. package/build/credentials/android/AndroidCredentialsProvider.d.ts +2 -2
  71. package/build/credentials/android/actions/AssignFcm.d.ts +1 -1
  72. package/build/credentials/android/actions/AssignGoogleServiceAccountKeyForFcmV1.d.ts +1 -1
  73. package/build/credentials/android/actions/AssignGoogleServiceAccountKeyForSubmissions.d.ts +1 -1
  74. package/build/credentials/android/actions/CreateFcm.d.ts +1 -1
  75. package/build/credentials/android/actions/CreateGoogleServiceAccountKey.d.ts +1 -1
  76. package/build/credentials/android/actions/CreateKeystore.d.ts +1 -1
  77. package/build/credentials/android/actions/DownloadKeystore.d.ts +2 -2
  78. package/build/credentials/android/actions/RemoveFcm.d.ts +1 -1
  79. package/build/credentials/android/actions/RemoveGoogleServiceAccountKey.d.ts +2 -2
  80. package/build/credentials/android/actions/RemoveKeystore.d.ts +1 -1
  81. package/build/credentials/android/actions/SetUpBuildCredentials.d.ts +1 -1
  82. package/build/credentials/android/actions/SetUpBuildCredentialsFromCredentialsJson.d.ts +1 -1
  83. package/build/credentials/android/actions/SetUpGoogleServiceAccountKeyForFcmV1.d.ts +1 -1
  84. package/build/credentials/android/actions/SetUpGoogleServiceAccountKeyForSubmissions.d.ts +1 -1
  85. package/build/credentials/android/actions/UseExistingGoogleServiceAccountKey.d.ts +1 -1
  86. package/build/credentials/android/api/GraphqlClient.js +3 -3
  87. package/build/credentials/context.d.ts +2 -2
  88. package/build/credentials/context.js +1 -1
  89. package/build/credentials/ios/IosCredentialsProvider.d.ts +2 -2
  90. package/build/credentials/ios/IosCredentialsProvider.js +1 -1
  91. package/build/credentials/ios/actions/AscApiKeyUtils.js +1 -1
  92. package/build/credentials/ios/actions/AssignAscApiKey.d.ts +1 -1
  93. package/build/credentials/ios/actions/AssignPushKey.d.ts +1 -1
  94. package/build/credentials/ios/actions/ConfigureProvisioningProfile.d.ts +4 -4
  95. package/build/credentials/ios/actions/CreateAscApiKey.d.ts +1 -1
  96. package/build/credentials/ios/actions/CreateDistributionCertificate.d.ts +1 -1
  97. package/build/credentials/ios/actions/CreateProvisioningProfile.d.ts +3 -3
  98. package/build/credentials/ios/actions/CreatePushKey.d.ts +1 -1
  99. package/build/credentials/ios/actions/DistributionCertificateUtils.js +5 -5
  100. package/build/credentials/ios/actions/ProvisioningProfileUtils.js +1 -1
  101. package/build/credentials/ios/actions/PushKeyUtils.js +2 -2
  102. package/build/credentials/ios/actions/RemoveAscApiKey.d.ts +2 -2
  103. package/build/credentials/ios/actions/RemoveDistributionCertificate.d.ts +3 -3
  104. package/build/credentials/ios/actions/RemoveProvisioningProfile.d.ts +2 -2
  105. package/build/credentials/ios/actions/RemovePushKey.d.ts +2 -2
  106. package/build/credentials/ios/actions/SetUpAdhocProvisioningProfile.d.ts +1 -1
  107. package/build/credentials/ios/actions/SetUpAdhocProvisioningProfile.js +1 -1
  108. package/build/credentials/ios/actions/SetUpAscApiKey.d.ts +2 -2
  109. package/build/credentials/ios/actions/SetUpBuildCredentials.d.ts +1 -1
  110. package/build/credentials/ios/actions/SetUpBuildCredentialsFromCredentialsJson.d.ts +3 -3
  111. package/build/credentials/ios/actions/SetUpDistributionCertificate.d.ts +2 -2
  112. package/build/credentials/ios/actions/SetUpDistributionCertificate.js +1 -1
  113. package/build/credentials/ios/actions/SetUpInternalProvisioningProfile.d.ts +1 -1
  114. package/build/credentials/ios/actions/SetUpProvisioningProfile.d.ts +3 -3
  115. package/build/credentials/ios/actions/SetUpProvisioningProfile.js +1 -1
  116. package/build/credentials/ios/actions/SetUpPushKey.d.ts +1 -1
  117. package/build/credentials/ios/actions/SetUpTargetBuildCredentials.d.ts +1 -1
  118. package/build/credentials/ios/actions/SetUpTargetBuildCredentialsFromCredentialsJson.d.ts +3 -3
  119. package/build/credentials/ios/actions/UpdateCredentialsJson.d.ts +3 -3
  120. package/build/credentials/ios/api/GraphqlClient.js +4 -4
  121. package/build/credentials/ios/appstore/AppStoreApi.js +4 -4
  122. package/build/credentials/ios/appstore/authenticate.js +1 -1
  123. package/build/credentials/ios/appstore/bundleId.js +1 -1
  124. package/build/credentials/ios/appstore/bundleIdCapabilities.js +1 -1
  125. package/build/credentials/ios/appstore/ensureAppExists.js +1 -1
  126. package/build/credentials/ios/appstore/keychain.js +8 -6
  127. package/build/credentials/ios/appstore/provisioningProfile.js +1 -1
  128. package/build/credentials/ios/appstore/pushKey.js +1 -1
  129. package/build/credentials/ios/appstore/resolveCredentials.js +2 -2
  130. package/build/credentials/ios/credentials.js +1 -1
  131. package/build/credentials/ios/utils/convertHTMLToASCII.js +1 -1
  132. package/build/credentials/ios/validators/validateProvisioningProfile.js +2 -4
  133. package/build/credentials/manager/CheckBuildProfileFlagAgainstEasJson.d.ts +3 -3
  134. package/build/credentials/manager/CreateAndroidBuildCredentials.d.ts +1 -1
  135. package/build/credentials/manager/ManageAndroid.js +2 -1
  136. package/build/credentials/manager/ManageIos.js +3 -2
  137. package/build/credentials/manager/SelectAndroidBuildCredentials.d.ts +2 -2
  138. package/build/credentials/manager/SelectBuildProfileFromEasJson.d.ts +2 -2
  139. package/build/credentials/manager/SelectIosDistributionTypeGraphqlFromBuildProfile.d.ts +1 -1
  140. package/build/credentials/manager/SelectIosDistributionTypeGraphqlFromBuildProfile.js +1 -1
  141. package/build/credentials/manager/SelectPlatform.js +3 -2
  142. package/build/credentials/manager/SetDefaultAndroidKeystore.d.ts +1 -1
  143. package/build/credentials/manager/SetUpAndroidBuildCredentials.d.ts +1 -1
  144. package/build/credentials/manager/SetUpBuildCredentialsCommandAction.js +3 -2
  145. package/build/credentials/manager/SetUpIosBuildCredentials.d.ts +1 -1
  146. package/build/devices/actions/create/action.d.ts +4 -4
  147. package/build/devices/actions/create/registrationUrlMethod.js +3 -1
  148. package/build/devices/manager.d.ts +4 -4
  149. package/build/devices/queries.js +3 -1
  150. package/build/easMultiselect.js +6 -2
  151. package/build/graphql/generated.d.ts +874 -62
  152. package/build/graphql/generated.js +92 -2
  153. package/build/graphql/mutations/EnvironmentVariableMutation.d.ts +39 -0
  154. package/build/graphql/mutations/EnvironmentVariableMutation.js +133 -0
  155. package/build/graphql/mutations/PublishMutation.d.ts +1 -0
  156. package/build/graphql/mutations/PublishMutation.js +16 -0
  157. package/build/graphql/queries/BranchQuery.d.ts +7 -1
  158. package/build/graphql/queries/BranchQuery.js +42 -0
  159. package/build/graphql/queries/EnvironmentVariablesQuery.d.ts +22 -0
  160. package/build/graphql/queries/EnvironmentVariablesQuery.js +106 -0
  161. package/build/graphql/types/EnvironmentVariable.d.ts +1 -0
  162. package/build/graphql/types/EnvironmentVariable.js +16 -0
  163. package/build/graphql/types/Update.js +4 -0
  164. package/build/metadata/apple/config/reader.js +1 -1
  165. package/build/metadata/apple/tasks/age-rating.js +1 -1
  166. package/build/metadata/apple/tasks/app-review-detail.js +2 -1
  167. package/build/metadata/apple/tasks/app-version.d.ts +1 -1
  168. package/build/metadata/config/resolve.js +2 -1
  169. package/build/metadata/errors.js +2 -1
  170. package/build/metadata/utils/log.js +1 -1
  171. package/build/metadata/utils/retry.js +1 -1
  172. package/build/onboarding/runCommand.js +1 -1
  173. package/build/ora.js +12 -4
  174. package/build/project/android/applicationId.js +1 -1
  175. package/build/project/applicationIdentifier.d.ts +3 -2
  176. package/build/project/applicationIdentifier.js +2 -2
  177. package/build/project/expoConfig.js +2 -2
  178. package/build/project/ios/entitlements.js +1 -1
  179. package/build/project/publish.d.ts +31 -18
  180. package/build/project/publish.js +61 -37
  181. package/build/project/resolveRuntimeVersionAsync.d.ts +4 -1
  182. package/build/project/resolveRuntimeVersionAsync.js +9 -3
  183. package/build/rollout/actions/CreateRollout.d.ts +2 -2
  184. package/build/rollout/actions/EditRollout.d.ts +2 -2
  185. package/build/rollout/actions/EndRollout.d.ts +2 -2
  186. package/build/rollout/actions/ManageRollout.d.ts +2 -2
  187. package/build/rollout/actions/NonInteractiveRollout.d.ts +1 -1
  188. package/build/rollout/actions/RolloutMainMenu.d.ts +1 -1
  189. package/build/rollout/actions/SelectRuntime.d.ts +3 -3
  190. package/build/run/android/adb.js +1 -1
  191. package/build/run/ios/simctl.js +1 -1
  192. package/build/run/ios/systemRequirements.js +1 -1
  193. package/build/submit/ArchiveSource.js +15 -15
  194. package/build/submit/BaseSubmitter.js +2 -2
  195. package/build/submit/submit.js +1 -1
  196. package/build/update/android/UpdatesModule.js +1 -1
  197. package/build/update/configure.d.ts +1 -1
  198. package/build/update/queries.js +8 -3
  199. package/build/update/republish.js +2 -1
  200. package/build/update/utils.d.ts +1 -0
  201. package/build/update/utils.js +7 -0
  202. package/build/user/expoSsoLauncher.js +1 -1
  203. package/build/utils/download.js +2 -2
  204. package/build/utils/filterAsync.js +1 -1
  205. package/build/utils/formatVariable.d.ts +2 -0
  206. package/build/utils/formatVariable.js +16 -0
  207. package/build/utils/image.js +2 -2
  208. package/build/utils/progress.js +1 -1
  209. package/build/utils/promise.js +1 -1
  210. package/build/utils/prompts.d.ts +9 -0
  211. package/build/utils/prompts.js +68 -0
  212. package/build/utils/queries.js +2 -2
  213. package/build/vcs/clients/git.d.ts +1 -1
  214. package/build/vcs/local.d.ts +1 -1
  215. package/oclif.manifest.json +627 -22
  216. package/package.json +15 -15
@@ -0,0 +1,65 @@
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 chalk_1 = tslib_1.__importDefault(require("chalk"));
7
+ const EasCommand_1 = tslib_1.__importDefault(require("../../commandUtils/EasCommand"));
8
+ const flags_1 = require("../../commandUtils/flags");
9
+ const generated_1 = require("../../graphql/generated");
10
+ const EnvironmentVariableMutation_1 = require("../../graphql/mutations/EnvironmentVariableMutation");
11
+ const EnvironmentVariablesQuery_1 = require("../../graphql/queries/EnvironmentVariablesQuery");
12
+ const log_1 = tslib_1.__importDefault(require("../../log"));
13
+ const projectUtils_1 = require("../../project/projectUtils");
14
+ const prompts_1 = require("../../prompts");
15
+ const prompts_2 = require("../../utils/prompts");
16
+ class EnvironmentVariableUnlink extends EasCommand_1.default {
17
+ async runAsync() {
18
+ let { flags: { name, 'non-interactive': nonInteractive, environment }, } = await this.parse(_a);
19
+ const { privateProjectConfig: { projectId }, loggedIn: { graphqlClient }, } = await this.getContextAsync(_a, {
20
+ nonInteractive,
21
+ });
22
+ if (!environment) {
23
+ environment = await (0, prompts_2.promptVariableEnvironmentAsync)(nonInteractive);
24
+ }
25
+ const projectDisplayName = await (0, projectUtils_1.getDisplayNameForProjectIdAsync)(graphqlClient, projectId);
26
+ const appVariables = await EnvironmentVariablesQuery_1.EnvironmentVariablesQuery.byAppIdAsync(graphqlClient, {
27
+ appId: projectId,
28
+ environment,
29
+ });
30
+ const linkedVariables = appVariables.filter(({ scope }) => scope === generated_1.EnvironmentVariableScope.Shared);
31
+ if (linkedVariables.length === 0) {
32
+ throw new Error(`There are no linked shared env variables for project ${projectDisplayName}`);
33
+ }
34
+ if (!name) {
35
+ name = await (0, prompts_1.selectAsync)('Select shared variable to unlink', linkedVariables.map(variable => ({
36
+ title: variable.name,
37
+ value: variable.name,
38
+ })));
39
+ }
40
+ const selectedVariable = linkedVariables.find(variable => variable.name === name);
41
+ if (!selectedVariable) {
42
+ throw new Error(`Shared variable ${name} doesn't exist`);
43
+ }
44
+ const unlinkedVariable = await EnvironmentVariableMutation_1.EnvironmentVariableMutation.unlinkSharedEnvironmentVariableAsync(graphqlClient, selectedVariable.id, projectId, environment);
45
+ if (!unlinkedVariable) {
46
+ throw new Error(`Could not unlink variable with name ${selectedVariable.name} from project ${projectDisplayName}`);
47
+ }
48
+ log_1.default.withTick(`Unlinked variable ${chalk_1.default.bold(unlinkedVariable.name)} from the project ${chalk_1.default.bold(projectDisplayName)}.`);
49
+ }
50
+ }
51
+ _a = EnvironmentVariableUnlink;
52
+ EnvironmentVariableUnlink.description = 'unlink a shared environment variable to the current project';
53
+ EnvironmentVariableUnlink.hidden = true;
54
+ EnvironmentVariableUnlink.flags = {
55
+ name: core_1.Flags.string({
56
+ description: 'Name of the variable',
57
+ }),
58
+ ...flags_1.EASEnvironmentFlag,
59
+ ...flags_1.EASNonInteractiveFlag,
60
+ };
61
+ EnvironmentVariableUnlink.contextDefinition = {
62
+ ..._a.ContextOptions.ProjectConfig,
63
+ ..._a.ContextOptions.LoggedIn,
64
+ };
65
+ exports.default = EnvironmentVariableUnlink;
@@ -0,0 +1,21 @@
1
+ import EasCommand from '../../commandUtils/EasCommand';
2
+ import { EnvironmentVariableScope, EnvironmentVariableVisibility } from '../../graphql/generated';
3
+ export default class EnvironmentVariableUpdate extends EasCommand {
4
+ static description: string;
5
+ static hidden: boolean;
6
+ static flags: {
7
+ 'non-interactive': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
8
+ environment: import("@oclif/core/lib/interfaces").OptionFlag<import("../../graphql/generated").EnvironmentVariableEnvironment | undefined>;
9
+ scope: import("@oclif/core/lib/interfaces").OptionFlag<EnvironmentVariableScope>;
10
+ visibility: import("@oclif/core/lib/interfaces").OptionFlag<EnvironmentVariableVisibility | undefined>;
11
+ name: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
12
+ value: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
13
+ };
14
+ static contextDefinition: {
15
+ loggedIn: import("../../commandUtils/context/LoggedInContextField").default;
16
+ analytics: import("../../commandUtils/context/AnalyticsContextField").default;
17
+ privateProjectConfig: import("../../commandUtils/context/PrivateProjectConfigContextField").PrivateProjectConfigContextField;
18
+ };
19
+ runAsync(): Promise<void>;
20
+ private validateFlags;
21
+ }
@@ -0,0 +1,135 @@
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 chalk_1 = tslib_1.__importDefault(require("chalk"));
7
+ const EasCommand_1 = tslib_1.__importDefault(require("../../commandUtils/EasCommand"));
8
+ const flags_1 = require("../../commandUtils/flags");
9
+ const generated_1 = require("../../graphql/generated");
10
+ const EnvironmentVariableMutation_1 = require("../../graphql/mutations/EnvironmentVariableMutation");
11
+ const EnvironmentVariablesQuery_1 = require("../../graphql/queries/EnvironmentVariablesQuery");
12
+ const log_1 = tslib_1.__importDefault(require("../../log"));
13
+ const projectUtils_1 = require("../../project/projectUtils");
14
+ const prompts_1 = require("../../prompts");
15
+ const prompts_2 = require("../../utils/prompts");
16
+ class EnvironmentVariableUpdate extends EasCommand_1.default {
17
+ async runAsync() {
18
+ const { flags } = await this.parse(_a);
19
+ let { name, value, scope, 'non-interactive': nonInteractive, environment, visibility, } = this.validateFlags(flags);
20
+ const { privateProjectConfig: { projectId }, loggedIn: { graphqlClient }, } = await this.getContextAsync(_a, {
21
+ nonInteractive,
22
+ });
23
+ const [projectDisplayName, ownerAccount] = await Promise.all([
24
+ (0, projectUtils_1.getDisplayNameForProjectIdAsync)(graphqlClient, projectId),
25
+ (0, projectUtils_1.getOwnerAccountForProjectIdAsync)(graphqlClient, projectId),
26
+ ]);
27
+ if (scope === generated_1.EnvironmentVariableScope.Project) {
28
+ if (!environment) {
29
+ environment = await (0, prompts_2.promptVariableEnvironmentAsync)(nonInteractive);
30
+ }
31
+ const existingVariables = await EnvironmentVariablesQuery_1.EnvironmentVariablesQuery.byAppIdAsync(graphqlClient, {
32
+ appId: projectId,
33
+ environment,
34
+ });
35
+ if (!name) {
36
+ name = await (0, prompts_1.selectAsync)('Select variable', existingVariables.map(variable => ({
37
+ title: variable.name,
38
+ value: variable.name,
39
+ })));
40
+ }
41
+ const existingVariable = existingVariables.find(variable => variable.name === name);
42
+ if (!existingVariable) {
43
+ throw new Error(`Variable with name ${name} does not exist on project ${projectDisplayName}`);
44
+ }
45
+ if (!value) {
46
+ value = await (0, prompts_2.promptVariableValueAsync)({
47
+ nonInteractive,
48
+ required: false,
49
+ initial: existingVariable.value,
50
+ });
51
+ if (!value || value.length === 0) {
52
+ value = '';
53
+ }
54
+ }
55
+ const variable = await EnvironmentVariableMutation_1.EnvironmentVariableMutation.createForAppAsync(graphqlClient, {
56
+ name,
57
+ value,
58
+ environment,
59
+ visibility,
60
+ overwrite: true,
61
+ }, projectId);
62
+ if (!variable) {
63
+ throw new Error(`Could not update variable with name ${name} on project ${projectDisplayName}`);
64
+ }
65
+ log_1.default.withTick(`Updated variable ${chalk_1.default.bold(name)} on project ${chalk_1.default.bold(projectDisplayName)}.`);
66
+ }
67
+ else if (scope === generated_1.EnvironmentVariableScope.Shared) {
68
+ const sharedVariables = await EnvironmentVariablesQuery_1.EnvironmentVariablesQuery.sharedAsync(graphqlClient, {
69
+ appId: projectId,
70
+ });
71
+ if (!name) {
72
+ name = await (0, prompts_1.selectAsync)('Select variable', sharedVariables.map(variable => ({
73
+ title: variable.name,
74
+ value: variable.name,
75
+ })));
76
+ }
77
+ const existingVariable = sharedVariables.find(variable => variable.name === name);
78
+ if (!existingVariable) {
79
+ throw new Error("Variable with this name doesn't exist on this account. Use a different name.");
80
+ }
81
+ if (!value) {
82
+ value = await (0, prompts_2.promptVariableValueAsync)({
83
+ nonInteractive,
84
+ required: false,
85
+ initial: existingVariable.value,
86
+ });
87
+ if (!value || value.length === 0) {
88
+ value = '';
89
+ }
90
+ }
91
+ const variable = await EnvironmentVariableMutation_1.EnvironmentVariableMutation.createSharedVariableAsync(graphqlClient, {
92
+ name,
93
+ value,
94
+ visibility,
95
+ overwrite: true,
96
+ }, ownerAccount.id);
97
+ if (!variable) {
98
+ throw new Error(`Could not update variable with name ${name} on account ${ownerAccount.name}`);
99
+ }
100
+ log_1.default.withTick(`Updated shared variable ${chalk_1.default.bold(name)} on account ${chalk_1.default.bold(ownerAccount.name)}.`);
101
+ }
102
+ }
103
+ validateFlags(flags) {
104
+ if (flags['non-interactive']) {
105
+ if (!flags.name) {
106
+ throw new Error('Variable name is required in non-interactive mode. Run the command with --name flag.');
107
+ }
108
+ if (flags.scope === generated_1.EnvironmentVariableScope.Project && !flags.environment) {
109
+ throw new Error('Environment is required when updating project-wide variable in non-interactive mode. Run the command with --environment flag.');
110
+ }
111
+ }
112
+ return flags;
113
+ }
114
+ }
115
+ _a = EnvironmentVariableUpdate;
116
+ EnvironmentVariableUpdate.description = 'update an environment variable on the current project or owner account';
117
+ EnvironmentVariableUpdate.hidden = true;
118
+ EnvironmentVariableUpdate.flags = {
119
+ name: core_1.Flags.string({
120
+ description: 'Name of the variable',
121
+ }),
122
+ value: core_1.Flags.string({
123
+ description: 'Text value or the variable',
124
+ }),
125
+ ...flags_1.EASVariableVisibilityFlag,
126
+ ...flags_1.EASVariableScopeFlag,
127
+ ...flags_1.EASEnvironmentFlag,
128
+ ...flags_1.EASNonInteractiveFlag,
129
+ };
130
+ EnvironmentVariableUpdate.contextDefinition = {
131
+ ..._a.ContextOptions.ProjectConfig,
132
+ ..._a.ContextOptions.Analytics,
133
+ ..._a.ContextOptions.LoggedIn,
134
+ };
135
+ exports.default = EnvironmentVariableUpdate;
@@ -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;