eas-cli 14.4.1 → 14.6.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 (58) hide show
  1. package/README.md +147 -91
  2. package/build/build/android/graphql.js +2 -0
  3. package/build/build/android/prepareJob.js +1 -0
  4. package/build/build/android/version.d.ts +1 -0
  5. package/build/build/android/version.js +5 -1
  6. package/build/build/build.js +4 -3
  7. package/build/build/configure.d.ts +11 -0
  8. package/build/build/configure.js +46 -1
  9. package/build/build/evaluateConfigWithEnvVarsAsync.js +2 -4
  10. package/build/build/ios/build.js +2 -0
  11. package/build/build/ios/graphql.js +2 -0
  12. package/build/build/ios/prepareJob.js +1 -0
  13. package/build/build/ios/version.js +4 -1
  14. package/build/build/local.js +1 -1
  15. package/build/build/metadata.js +0 -1
  16. package/build/build/runBuildAndSubmit.d.ts +12 -1
  17. package/build/build/runBuildAndSubmit.js +16 -13
  18. package/build/build/utils/environment.d.ts +4 -0
  19. package/build/build/utils/environment.js +20 -0
  20. package/build/commands/build/dev.d.ts +23 -0
  21. package/build/commands/build/dev.js +225 -0
  22. package/build/commands/build/index.js +9 -1
  23. package/build/commands/build/inspect.js +26 -18
  24. package/build/commands/build/internal.js +22 -14
  25. package/build/commands/build/list.d.ts +1 -0
  26. package/build/commands/build/list.js +4 -0
  27. package/build/commands/{worker → deploy}/alias.js +4 -4
  28. package/build/commands/{worker/deploy.js → deploy/index.js} +5 -5
  29. package/build/commands/fingerprint/compare.d.ts +14 -1
  30. package/build/commands/fingerprint/compare.js +192 -53
  31. package/build/commands/project/onboarding.js +23 -14
  32. package/build/commands/update/index.js +3 -6
  33. package/build/commands/update/roll-back-to-embedded.js +2 -2
  34. package/build/credentials/ios/appstore/ensureAppExists.d.ts +22 -1
  35. package/build/credentials/ios/appstore/ensureAppExists.js +73 -2
  36. package/build/credentials/ios/appstore/ensureTestFlightGroup.d.ts +7 -0
  37. package/build/credentials/ios/appstore/ensureTestFlightGroup.js +158 -0
  38. package/build/credentials/ios/appstore/provisioningProfile.js +1 -0
  39. package/build/credentials/ios/appstore/resolveCredentials.js +6 -1
  40. package/build/graphql/generated.d.ts +313 -3
  41. package/build/graphql/generated.js +11 -2
  42. package/build/graphql/queries/FingerprintQuery.d.ts +16 -0
  43. package/build/graphql/queries/FingerprintQuery.js +61 -0
  44. package/build/graphql/types/Fingerprint.js +18 -0
  45. package/build/project/ios/exemptEncryption.d.ts +7 -0
  46. package/build/project/ios/exemptEncryption.js +80 -0
  47. package/build/project/publish.d.ts +4 -4
  48. package/build/project/publish.js +9 -8
  49. package/build/project/resolveRuntimeVersionAsync.d.ts +4 -4
  50. package/build/project/resolveRuntimeVersionAsync.js +4 -4
  51. package/build/submit/ios/AppProduce.js +12 -23
  52. package/build/utils/fingerprintCli.d.ts +2 -1
  53. package/build/utils/fingerprintCli.js +11 -3
  54. package/build/worker/upload.js +19 -3
  55. package/oclif.manifest.json +217 -155
  56. package/package.json +6 -6
  57. /package/build/commands/{worker → deploy}/alias.d.ts +0 -0
  58. /package/build/commands/{worker/deploy.d.ts → deploy/index.d.ts} +0 -0
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const eas_build_job_1 = require("@expo/eas-build-job");
5
+ const eas_json_1 = require("@expo/eas-json");
6
+ const core_1 = require("@oclif/core");
7
+ const configure_1 = require("../../build/configure");
8
+ const evaluateConfigWithEnvVarsAsync_1 = require("../../build/evaluateConfigWithEnvVarsAsync");
9
+ const runBuildAndSubmit_1 = require("../../build/runBuildAndSubmit");
10
+ const repository_1 = require("../../build/utils/repository");
11
+ const EasCommand_1 = tslib_1.__importDefault(require("../../commandUtils/EasCommand"));
12
+ const generated_1 = require("../../graphql/generated");
13
+ const BuildQuery_1 = require("../../graphql/queries/BuildQuery");
14
+ const AppPlatform_1 = require("../../graphql/types/AppPlatform");
15
+ const log_1 = tslib_1.__importDefault(require("../../log"));
16
+ const platform_1 = require("../../platform");
17
+ const workflow_1 = require("../../project/workflow");
18
+ const prompts_1 = require("../../prompts");
19
+ const run_1 = require("../../run/run");
20
+ const download_1 = require("../../utils/download");
21
+ const fingerprintCli_1 = require("../../utils/fingerprintCli");
22
+ const profiles_1 = require("../../utils/profiles");
23
+ const DEFAULT_EAS_BUILD_RUN_PROFILE_NAME = 'development-simulator';
24
+ class BuildDev extends EasCommand_1.default {
25
+ static hidden;
26
+ static description = 'run dev client simulator/emulator build with matching fingerprint or create a new one';
27
+ static flags = {
28
+ platform: core_1.Flags.enum({
29
+ char: 'p',
30
+ options: [eas_build_job_1.Platform.IOS, eas_build_job_1.Platform.ANDROID],
31
+ }),
32
+ profile: core_1.Flags.string({
33
+ char: 'e',
34
+ description: `Name of the build profile from eas.json. It must be a profile allowing to create emulator/simulator internal distribution dev client builds. The "${DEFAULT_EAS_BUILD_RUN_PROFILE_NAME}" build profile will be selected by default.`,
35
+ helpValue: 'PROFILE_NAME',
36
+ }),
37
+ };
38
+ static contextDefinition = {
39
+ ...this.ContextOptions.LoggedIn,
40
+ ...this.ContextOptions.DynamicProjectConfig,
41
+ ...this.ContextOptions.ProjectDir,
42
+ ...this.ContextOptions.Vcs,
43
+ ...this.ContextOptions.Analytics,
44
+ ...this.ContextOptions.ProjectId,
45
+ };
46
+ async runAsync() {
47
+ const { flags } = await this.parse(BuildDev);
48
+ const { loggedIn: { actor, graphqlClient }, getDynamicPrivateProjectConfigAsync, projectDir, analytics, vcsClient, projectId, } = await this.getContextAsync(BuildDev, {
49
+ nonInteractive: false,
50
+ withServerSideEnvironment: null,
51
+ });
52
+ const platform = await this.selectPlatformAsync(flags.platform);
53
+ if (process.platform !== 'darwin' && platform === eas_build_job_1.Platform.IOS) {
54
+ core_1.Errors.error('Running iOS builds in simulator is only supported on macOS.', { exit: 1 });
55
+ }
56
+ await vcsClient.ensureRepoExistsAsync();
57
+ await (0, repository_1.ensureRepoIsCleanAsync)(vcsClient, flags.nonInteractive);
58
+ await (0, configure_1.ensureProjectConfiguredAsync)({
59
+ projectDir,
60
+ nonInteractive: false,
61
+ vcsClient,
62
+ });
63
+ const buildProfile = await this.ensureValidBuildRunProfileExistsAsync({
64
+ projectDir,
65
+ platform,
66
+ selectedBuildProfileName: flags.profile,
67
+ vcsClient,
68
+ });
69
+ const workflow = await (0, workflow_1.resolveWorkflowAsync)(projectDir, platform, vcsClient);
70
+ const { env } = await (0, evaluateConfigWithEnvVarsAsync_1.evaluateConfigWithEnvVarsAsync)({
71
+ buildProfile: buildProfile.profile,
72
+ buildProfileName: buildProfile.profileName,
73
+ graphqlClient,
74
+ getProjectConfig: getDynamicPrivateProjectConfigAsync,
75
+ opts: { env: buildProfile.profile.env },
76
+ });
77
+ const fingerprint = await (0, fingerprintCli_1.createFingerprintAsync)(projectDir, {
78
+ env,
79
+ workflow,
80
+ platforms: [platform],
81
+ });
82
+ if (!fingerprint) {
83
+ core_1.Errors.error('Failed to calculate fingerprint', { exit: 1 });
84
+ }
85
+ log_1.default.log(`✨ Calculated fingerprint hash: ${fingerprint.hash}`);
86
+ log_1.default.newLine();
87
+ const builds = await BuildQuery_1.BuildQuery.viewBuildsOnAppAsync(graphqlClient, {
88
+ appId: projectId,
89
+ filter: {
90
+ platform: (0, AppPlatform_1.toAppPlatform)(platform),
91
+ fingerprintHash: fingerprint.hash,
92
+ status: generated_1.BuildStatus.Finished,
93
+ simulator: platform === eas_build_job_1.Platform.IOS ? true : undefined,
94
+ distribution: platform === eas_build_job_1.Platform.ANDROID ? generated_1.DistributionType.Internal : undefined,
95
+ developmentClient: true,
96
+ },
97
+ offset: 0,
98
+ limit: 1,
99
+ });
100
+ if (builds.length !== 0) {
101
+ const build = builds[0];
102
+ log_1.default.succeed(`🎯 Found successful build with matching fingerprint on EAS servers. Running it...`);
103
+ if (build.artifacts?.applicationArchiveUrl) {
104
+ const buildPath = await (0, download_1.downloadAndMaybeExtractAppAsync)(build.artifacts.applicationArchiveUrl, build.platform);
105
+ await (0, run_1.runAsync)(buildPath, build.platform);
106
+ return;
107
+ }
108
+ else {
109
+ log_1.default.warn('Artifacts for this build expired. New build will be started.');
110
+ }
111
+ }
112
+ log_1.default.log('🚀 No successful build with matching fingerprint found. Starting a new build...');
113
+ await (0, runBuildAndSubmit_1.runBuildAndSubmitAsync)({
114
+ graphqlClient,
115
+ analytics,
116
+ vcsClient,
117
+ projectDir,
118
+ flags: {
119
+ requestedPlatform: platform === eas_build_job_1.Platform.ANDROID ? platform_1.RequestedPlatform.Android : platform_1.RequestedPlatform.Ios,
120
+ nonInteractive: false,
121
+ freezeCredentials: false,
122
+ wait: true,
123
+ clearCache: false,
124
+ json: false,
125
+ autoSubmit: false,
126
+ localBuildOptions: {},
127
+ repack: false,
128
+ profile: flags.profile ?? DEFAULT_EAS_BUILD_RUN_PROFILE_NAME,
129
+ },
130
+ actor,
131
+ getDynamicPrivateProjectConfigAsync,
132
+ downloadSimBuildAutoConfirm: true,
133
+ envOverride: env,
134
+ });
135
+ }
136
+ async selectPlatformAsync(platform) {
137
+ if (platform) {
138
+ return platform;
139
+ }
140
+ const { resolvedPlatform } = await (0, prompts_1.promptAsync)({
141
+ type: 'select',
142
+ message: 'Select platform',
143
+ name: 'resolvedPlatform',
144
+ choices: [
145
+ { title: 'Android', value: eas_build_job_1.Platform.ANDROID },
146
+ { title: 'iOS', value: eas_build_job_1.Platform.IOS },
147
+ ],
148
+ });
149
+ return resolvedPlatform;
150
+ }
151
+ async validateBuildRunProfileAsync({ platform, buildProfile, buildProfileName, }) {
152
+ if (buildProfile.developmentClient !== true) {
153
+ core_1.Errors.error(`Profile "${buildProfileName}" must specify "developmentClient: true" to create a dev client build. Select a different profile or update the profile in eas.json.`, { exit: 1 });
154
+ }
155
+ if (buildProfile.distribution !== 'internal') {
156
+ core_1.Errors.error(`Profile "${buildProfileName}" must specify "distribution: internal" in order to work with eas build:dev command. Select a different profile or update the profile in eas.json.`, { exit: 1 });
157
+ }
158
+ if (platform === eas_build_job_1.Platform.IOS) {
159
+ const iosProfile = buildProfile;
160
+ if (iosProfile.simulator !== true && iosProfile.withoutCredentials !== true) {
161
+ core_1.Errors.error(`Profile "${buildProfileName}" must specify "ios.simulator: true" or "withoutCredentials: true" to create an iOS simulator build. Select a different profile or update the profile in eas.json.`, { exit: 1 });
162
+ }
163
+ }
164
+ else {
165
+ const androidProfile = buildProfile;
166
+ if (androidProfile.distribution !== 'internal' &&
167
+ androidProfile.withoutCredentials !== true) {
168
+ core_1.Errors.error(`Profile "${buildProfileName}" must specify "distribution: internal" or "withoutCredentials: true" to create an Android emulator build. Select a different profile or update the profile in eas.json.`, { exit: 1 });
169
+ }
170
+ }
171
+ }
172
+ async ensureValidBuildRunProfileExistsAsync({ projectDir, platform, selectedBuildProfileName, vcsClient, }) {
173
+ if (!!selectedBuildProfileName ||
174
+ (await (0, configure_1.doesBuildProfileExistAsync)({
175
+ projectDir,
176
+ profileName: DEFAULT_EAS_BUILD_RUN_PROFILE_NAME,
177
+ }))) {
178
+ const easJsonAccessor = eas_json_1.EasJsonAccessor.fromProjectPath(projectDir);
179
+ const [buildProfile] = await (0, profiles_1.getProfilesAsync)({
180
+ type: 'build',
181
+ easJsonAccessor,
182
+ platforms: [platform],
183
+ profileName: selectedBuildProfileName ?? DEFAULT_EAS_BUILD_RUN_PROFILE_NAME,
184
+ projectDir,
185
+ });
186
+ await this.validateBuildRunProfileAsync({
187
+ buildProfileName: selectedBuildProfileName ?? DEFAULT_EAS_BUILD_RUN_PROFILE_NAME,
188
+ platform,
189
+ buildProfile: buildProfile.profile,
190
+ });
191
+ }
192
+ else {
193
+ const createBuildProfile = await (0, prompts_1.confirmAsync)({
194
+ message: `We want to go ahead and generate "${DEFAULT_EAS_BUILD_RUN_PROFILE_NAME}" build profile for you, that matches eas build:dev criteria. Do you want to proceed?`,
195
+ });
196
+ if (!createBuildProfile) {
197
+ core_1.Errors.error('Come back later or specify different build compliant with eas build:dev requirements by using "--profile" flag.', { exit: 1 });
198
+ }
199
+ await (0, configure_1.createBuildProfileAsync)({
200
+ projectDir,
201
+ profileName: DEFAULT_EAS_BUILD_RUN_PROFILE_NAME,
202
+ profileContents: {
203
+ developmentClient: true,
204
+ distribution: 'internal',
205
+ ios: {
206
+ simulator: true,
207
+ },
208
+ environment: 'development',
209
+ },
210
+ nonInteractive: false,
211
+ vcsClient,
212
+ });
213
+ }
214
+ const easJsonAccessor = eas_json_1.EasJsonAccessor.fromProjectPath(projectDir);
215
+ const [buildProfile] = await (0, profiles_1.getProfilesAsync)({
216
+ type: 'build',
217
+ easJsonAccessor,
218
+ platforms: [platform],
219
+ profileName: selectedBuildProfileName ?? DEFAULT_EAS_BUILD_RUN_PROFILE_NAME,
220
+ projectDir,
221
+ });
222
+ return buildProfile;
223
+ }
224
+ }
225
+ exports.default = BuildDev;
@@ -118,7 +118,15 @@ class Build extends EasCommand_1.default {
118
118
  : [generated_1.StatuspageServiceName.EasBuild]);
119
119
  }
120
120
  const flagsWithPlatform = await this.ensurePlatformSelectedAsync(flags);
121
- await (0, runBuildAndSubmit_1.runBuildAndSubmitAsync)(graphqlClient, analytics, vcsClient, projectDir, flagsWithPlatform, actor, getDynamicPrivateProjectConfigAsync);
121
+ await (0, runBuildAndSubmit_1.runBuildAndSubmitAsync)({
122
+ graphqlClient,
123
+ analytics,
124
+ vcsClient,
125
+ projectDir,
126
+ flags: flagsWithPlatform,
127
+ actor,
128
+ getDynamicPrivateProjectConfigAsync,
129
+ });
122
130
  }
123
131
  sanitizeFlags(flags) {
124
132
  const nonInteractive = flags['non-interactive'];
@@ -83,25 +83,33 @@ class BuildInspect extends EasCommand_1.default {
83
83
  }
84
84
  else {
85
85
  try {
86
- await (0, runBuildAndSubmit_1.runBuildAndSubmitAsync)(graphqlClient, analytics, vcsClient, projectDir, {
87
- nonInteractive: false,
88
- freezeCredentials: false,
89
- wait: true,
90
- clearCache: false,
91
- json: false,
92
- autoSubmit: false,
93
- requestedPlatform: flags.platform,
94
- profile: flags.profile,
95
- localBuildOptions: {
96
- localBuildMode: local_1.LocalBuildMode.LOCAL_BUILD_PLUGIN,
97
- ...(flags.stage === InspectStage.PRE_BUILD ? { skipNativeBuild: true } : {}),
98
- ...(flags.stage === InspectStage.POST_BUILD ? { skipCleanup: true } : {}),
99
- verbose: flags.verbose,
100
- workingdir: tmpWorkingdir,
101
- artifactsDir: path_1.default.join(tmpWorkingdir, 'artifacts'),
86
+ await (0, runBuildAndSubmit_1.runBuildAndSubmitAsync)({
87
+ graphqlClient,
88
+ analytics,
89
+ vcsClient,
90
+ projectDir,
91
+ flags: {
92
+ nonInteractive: false,
93
+ freezeCredentials: false,
94
+ wait: true,
95
+ clearCache: false,
96
+ json: false,
97
+ autoSubmit: false,
98
+ requestedPlatform: flags.platform,
99
+ profile: flags.profile,
100
+ localBuildOptions: {
101
+ localBuildMode: local_1.LocalBuildMode.LOCAL_BUILD_PLUGIN,
102
+ ...(flags.stage === InspectStage.PRE_BUILD ? { skipNativeBuild: true } : {}),
103
+ ...(flags.stage === InspectStage.POST_BUILD ? { skipCleanup: true } : {}),
104
+ verbose: flags.verbose,
105
+ workingdir: tmpWorkingdir,
106
+ artifactsDir: path_1.default.join(tmpWorkingdir, 'artifacts'),
107
+ },
108
+ repack: false,
102
109
  },
103
- repack: false,
104
- }, actor, getDynamicPrivateProjectConfigAsync);
110
+ actor,
111
+ getDynamicPrivateProjectConfigAsync,
112
+ });
105
113
  if (!flags.verbose) {
106
114
  log_1.default.log(chalk_1.default.green('Build successful'));
107
115
  }
@@ -56,21 +56,29 @@ class BuildInternal extends EasCommand_1.default {
56
56
  withServerSideEnvironment: null,
57
57
  });
58
58
  await (0, _1.handleDeprecatedEasJsonAsync)(projectDir, flags.nonInteractive);
59
- await (0, runBuildAndSubmit_1.runBuildAndSubmitAsync)(graphqlClient, analytics, vcsClient, projectDir, {
60
- requestedPlatform: flags.platform,
61
- profile: flags.profile,
62
- nonInteractive: true,
63
- freezeCredentials: false,
64
- wait: false,
65
- clearCache: false,
66
- json: true,
67
- autoSubmit: flags['auto-submit'] || flags['auto-submit-with-profile'] !== undefined,
68
- localBuildOptions: {
69
- localBuildMode: local_1.LocalBuildMode.INTERNAL,
59
+ await (0, runBuildAndSubmit_1.runBuildAndSubmitAsync)({
60
+ graphqlClient,
61
+ analytics,
62
+ vcsClient,
63
+ projectDir,
64
+ flags: {
65
+ requestedPlatform: flags.platform,
66
+ profile: flags.profile,
67
+ nonInteractive: true,
68
+ freezeCredentials: false,
69
+ wait: false,
70
+ clearCache: false,
71
+ json: true,
72
+ autoSubmit: flags['auto-submit'] || flags['auto-submit-with-profile'] !== undefined,
73
+ localBuildOptions: {
74
+ localBuildMode: local_1.LocalBuildMode.INTERNAL,
75
+ },
76
+ submitProfile: flags['auto-submit-with-profile'] ?? flags.profile,
77
+ repack: false,
70
78
  },
71
- submitProfile: flags['auto-submit-with-profile'] ?? flags.profile,
72
- repack: false,
73
- }, actor, getDynamicPrivateProjectConfigAsync);
79
+ actor,
80
+ getDynamicPrivateProjectConfigAsync,
81
+ });
74
82
  }
75
83
  }
76
84
  exports.default = BuildInternal;
@@ -20,6 +20,7 @@ export default class BuildList extends EasCommand {
20
20
  'app-identifier': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
21
21
  'build-profile': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
22
22
  'git-commit-hash': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
23
+ 'fingerprint-hash': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined>;
23
24
  };
24
25
  static contextDefinition: {
25
26
  vcsClient: import("../../commandUtils/context/VcsClientContextField").default;
@@ -58,6 +58,9 @@ class BuildList extends EasCommand_1.default {
58
58
  aliases: ['gitCommitHash'],
59
59
  description: 'Filter only builds created with the specified git commit hash',
60
60
  }),
61
+ 'fingerprint-hash': core_1.Flags.string({
62
+ description: 'Filter only builds with the specified fingerprint hash',
63
+ }),
61
64
  ...pagination_1.EasPaginatedQueryFlags,
62
65
  limit: (0, pagination_1.getLimitFlagWithCustomValues)({ defaultTo: 10, limit: queries_1.BUILDS_LIMIT }),
63
66
  ...flags_1.EasNonInteractiveAndJsonFlags,
@@ -107,6 +110,7 @@ class BuildList extends EasCommand_1.default {
107
110
  buildProfile: flags['build-profile'],
108
111
  gitCommitHash: flags['git-commit-hash'],
109
112
  simulator: flags.simulator,
113
+ fingerprintHash: flags['fingerprint-hash'],
110
114
  },
111
115
  paginatedQueryOptions,
112
116
  });
@@ -12,9 +12,9 @@ const json_1 = require("../../utils/json");
12
12
  const deployment_1 = require("../../worker/deployment");
13
13
  const logs_1 = require("../../worker/utils/logs");
14
14
  class WorkerAlias extends EasCommand_1.default {
15
- static description = 'Assign deployment aliases';
16
- static aliases = ['deploy:alias', 'deploy:promote'];
17
- static state = 'beta';
15
+ static description = 'Assign deployment aliases.';
16
+ static aliases = ['worker:alias', 'deploy:promote'];
17
+ static state = 'preview';
18
18
  static flags = {
19
19
  prod: core_1.Flags.boolean({
20
20
  aliases: ['production'],
@@ -44,7 +44,7 @@ class WorkerAlias extends EasCommand_1.default {
44
44
  if (flags.json) {
45
45
  (0, json_1.enableJsonOutput)();
46
46
  }
47
- log_1.default.warn('EAS Hosting is still in beta and subject to changes.');
47
+ log_1.default.warn('EAS Hosting is still in preview and subject to changes.');
48
48
  const { getDynamicPrivateProjectConfigAsync, loggedIn: { graphqlClient }, } = await this.getContextAsync(WorkerAlias, {
49
49
  nonInteractive: true,
50
50
  withServerSideEnvironment: null,
@@ -21,10 +21,10 @@ const isDirectory = (directoryPath) => node_fs_1.default.promises
21
21
  .then(stat => stat.isDirectory())
22
22
  .catch(() => false);
23
23
  class WorkerDeploy extends EasCommand_1.default {
24
- static description = 'Deploy your Expo web build';
25
- static aliases = ['deploy'];
24
+ static description = 'Deploy your Expo Router web build and API Routes.';
25
+ static aliases = ['worker:deploy'];
26
26
  static usage = [(0, chalk_1.default) `deploy {dim [options]}`, `deploy --prod`];
27
- static state = 'beta';
27
+ static state = 'preview';
28
28
  static flags = {
29
29
  prod: core_1.Flags.boolean({
30
30
  aliases: ['production'],
@@ -62,7 +62,7 @@ class WorkerDeploy extends EasCommand_1.default {
62
62
  if (flags.json) {
63
63
  (0, json_1.enableJsonOutput)();
64
64
  }
65
- log_1.default.warn('EAS Hosting is still in beta and subject to changes.');
65
+ log_1.default.warn('EAS Hosting is still in preview and subject to changes.');
66
66
  const { getDynamicPrivateProjectConfigAsync, loggedIn: { graphqlClient }, projectDir, } = await this.getContextAsync(WorkerDeploy, { ...flags, withServerSideEnvironment: null });
67
67
  const projectDist = await resolveExportedProjectAsync(flags, projectDir);
68
68
  const { projectId } = await getDynamicPrivateProjectConfigAsync();
@@ -331,7 +331,7 @@ function logExportedProjectInfo(project) {
331
331
  // Only show the timestamp for exports older than 1 minute
332
332
  if (project.modifiedAt && Date.now() - project.modifiedAt.getTime() > 60000) {
333
333
  modifiedAgo = ` - exported ${(0, timeago_js_1.format)(project.modifiedAt)}`;
334
- log_1.default.warn(`> Project export: ${project.type}${modifiedAgo}}`);
334
+ log_1.default.warn(`> Project export: ${project.type}${modifiedAgo}`);
335
335
  }
336
336
  else {
337
337
  log_1.default.log((0, chalk_1.default) `{dim > Project export: ${project.type}}`);
@@ -2,9 +2,22 @@ import EasCommand from '../../commandUtils/EasCommand';
2
2
  import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient';
3
3
  import { BuildStatus } from '../../graphql/generated';
4
4
  import { RequestedPlatform } from '../../platform';
5
+ export interface FingerprintCompareFlags {
6
+ buildId?: string;
7
+ hash1?: string;
8
+ hash2?: string;
9
+ nonInteractive: boolean;
10
+ json: boolean;
11
+ }
5
12
  export default class FingerprintCompare extends EasCommand {
6
13
  static description: string;
7
- static hidden: boolean;
14
+ static strict: boolean;
15
+ static examples: string[];
16
+ static args: {
17
+ name: string;
18
+ description: string;
19
+ required: boolean;
20
+ }[];
8
21
  static flags: {
9
22
  json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
23
  'non-interactive': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;