eas-cli 14.5.0 → 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 (43) hide show
  1. package/README.md +126 -72
  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/configure.d.ts +11 -0
  7. package/build/build/configure.js +46 -1
  8. package/build/build/evaluateConfigWithEnvVarsAsync.js +2 -4
  9. package/build/build/ios/build.js +2 -0
  10. package/build/build/ios/graphql.js +2 -0
  11. package/build/build/ios/prepareJob.js +1 -0
  12. package/build/build/ios/version.js +4 -1
  13. package/build/build/local.js +1 -1
  14. package/build/build/metadata.js +0 -1
  15. package/build/build/runBuildAndSubmit.d.ts +12 -1
  16. package/build/build/runBuildAndSubmit.js +16 -13
  17. package/build/build/utils/environment.d.ts +4 -0
  18. package/build/build/utils/environment.js +20 -0
  19. package/build/commands/build/dev.d.ts +23 -0
  20. package/build/commands/build/dev.js +225 -0
  21. package/build/commands/build/index.js +9 -1
  22. package/build/commands/build/inspect.js +26 -18
  23. package/build/commands/build/internal.js +22 -14
  24. package/build/commands/fingerprint/compare.d.ts +14 -1
  25. package/build/commands/fingerprint/compare.js +192 -53
  26. package/build/commands/project/onboarding.js +23 -14
  27. package/build/credentials/ios/appstore/ensureAppExists.d.ts +22 -1
  28. package/build/credentials/ios/appstore/ensureAppExists.js +73 -2
  29. package/build/credentials/ios/appstore/ensureTestFlightGroup.d.ts +7 -0
  30. package/build/credentials/ios/appstore/ensureTestFlightGroup.js +158 -0
  31. package/build/credentials/ios/appstore/provisioningProfile.js +1 -0
  32. package/build/graphql/generated.d.ts +193 -3
  33. package/build/graphql/generated.js +11 -2
  34. package/build/graphql/queries/FingerprintQuery.d.ts +16 -0
  35. package/build/graphql/queries/FingerprintQuery.js +61 -0
  36. package/build/graphql/types/Fingerprint.js +18 -0
  37. package/build/project/ios/exemptEncryption.d.ts +7 -0
  38. package/build/project/ios/exemptEncryption.js +80 -0
  39. package/build/submit/ios/AppProduce.js +12 -23
  40. package/build/utils/fingerprintCli.d.ts +2 -1
  41. package/build/utils/fingerprintCli.js +11 -3
  42. package/oclif.manifest.json +60 -4
  43. package/package.json +4 -4
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureTestFlightGroupExistsAsync = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const apple_utils_1 = require("@expo/apple-utils");
6
+ const ensureAppExists_1 = require("./ensureAppExists");
7
+ const log_1 = tslib_1.__importDefault(require("../../../log"));
8
+ const ora_1 = require("../../../ora");
9
+ const prompts_1 = require("../../../prompts");
10
+ // The name of the internal TestFlight group, this should probably never change.
11
+ const AUTO_GROUP_NAME = 'Team (Expo)';
12
+ /**
13
+ * Ensure a TestFlight internal group with access to all builds exists for the app and has all admin users invited to it.
14
+ * This allows users to instantly access their builds from TestFlight after it finishes processing.
15
+ */
16
+ async function ensureTestFlightGroupExistsAsync(app) {
17
+ const group = await ensureInternalGroupAsync(app);
18
+ const users = await apple_utils_1.User.getAsync(app.context);
19
+ const admins = users.filter(user => user.attributes.roles?.includes(apple_utils_1.UserRole.ADMIN));
20
+ await addAllUsersToInternalGroupAsync(group, admins);
21
+ }
22
+ exports.ensureTestFlightGroupExistsAsync = ensureTestFlightGroupExistsAsync;
23
+ async function ensureInternalGroupAsync(app) {
24
+ const groups = await app.getBetaGroupsAsync({
25
+ query: {
26
+ includes: ['betaTesters'],
27
+ },
28
+ });
29
+ let betaGroup = groups.find(group => group.attributes.name === AUTO_GROUP_NAME);
30
+ if (!betaGroup) {
31
+ const spinner = (0, ora_1.ora)().start('Creating TestFlight group...');
32
+ try {
33
+ // Apple throw an error if you create the group too quickly after creating the app. We'll retry a few times.
34
+ await pollRetryAsync(async () => {
35
+ betaGroup = await app.createBetaGroupAsync({
36
+ name: AUTO_GROUP_NAME,
37
+ publicLinkEnabled: false,
38
+ publicLinkLimitEnabled: false,
39
+ isInternalGroup: true,
40
+ // Automatically add latest builds to the group without needing to run the command.
41
+ hasAccessToAllBuilds: true,
42
+ });
43
+ }, {
44
+ shouldRetry(error) {
45
+ if ((0, ensureAppExists_1.isAppleError)(error)) {
46
+ spinner.text = `TestFlight not ready, retrying in 25 seconds...`;
47
+ return error.data.errors.some(error => error.code === 'ENTITY_ERROR.RELATIONSHIP.INVALID');
48
+ }
49
+ return false;
50
+ },
51
+ });
52
+ spinner.succeed(`TestFlight group created: ${AUTO_GROUP_NAME}`);
53
+ }
54
+ catch (error) {
55
+ spinner.fail('Failed to create TestFlight group...');
56
+ throw error;
57
+ }
58
+ }
59
+ if (!betaGroup) {
60
+ throw new Error('Failed to create internal TestFlight group');
61
+ }
62
+ // `hasAccessToAllBuilds` is a newer feature that allows the group to automatically have access to all builds. This cannot be patched so we need to recreate the group.
63
+ if (!betaGroup.attributes.hasAccessToAllBuilds) {
64
+ if (await (0, prompts_1.confirmAsync)({
65
+ message: 'Regenerate internal TestFlight group to allow automatic access to all builds?',
66
+ })) {
67
+ await apple_utils_1.BetaGroup.deleteAsync(app.context, { id: betaGroup.id });
68
+ return await ensureInternalGroupAsync(app);
69
+ }
70
+ }
71
+ return betaGroup;
72
+ }
73
+ async function addAllUsersToInternalGroupAsync(group, users) {
74
+ let emails = users
75
+ .filter(user => user.attributes.email)
76
+ .map(user => ({
77
+ email: user.attributes.email,
78
+ firstName: user.attributes.firstName ?? '',
79
+ lastName: user.attributes.lastName ?? '',
80
+ }));
81
+ const { betaTesters } = group.attributes;
82
+ const existingEmails = betaTesters?.map(tester => tester.attributes.email).filter(Boolean) ?? [];
83
+ // Filter out existing beta testers.
84
+ if (betaTesters) {
85
+ emails = emails.filter(user => !existingEmails.find(existingEmail => existingEmail === user.email));
86
+ }
87
+ // No new users to add to the internal group.
88
+ if (!emails.length) {
89
+ // No need to log which users are here on subsequent runs as devs already know the drill at this point.
90
+ log_1.default.debug(`All current admins are already added to the group: ${group.attributes.name}`);
91
+ return;
92
+ }
93
+ log_1.default.debug(`Adding ${emails.length} users to internal group: ${group.attributes.name}`);
94
+ log_1.default.debug(`Users: ${emails.map(user => user.email).join(', ')}`);
95
+ const data = await group.createBulkBetaTesterAssignmentsAsync(emails);
96
+ const success = data.attributes.betaTesters.every(tester => {
97
+ if (tester.assignmentResult === 'FAILED') {
98
+ if (tester.errors && Array.isArray(tester.errors) && tester.errors.length) {
99
+ if (tester.errors.length === 1 &&
100
+ tester.errors[0].key === 'Halliday.tester.already.exists') {
101
+ return true;
102
+ }
103
+ for (const error of tester.errors) {
104
+ log_1.default.error(`Error adding user ${tester.email} to TestFlight group "${group.attributes.name}": ${error.key}`);
105
+ }
106
+ }
107
+ return false;
108
+ }
109
+ if (tester.assignmentResult === 'NOT_QUALIFIED_FOR_INTERNAL_GROUP') {
110
+ return false;
111
+ }
112
+ return true;
113
+ });
114
+ if (!success) {
115
+ const groupUrl = await getTestFlightGroupUrlAsync(group);
116
+ log_1.default.error(`Unable to add all admins to TestFlight group "${group.attributes.name}". You can add them manually in App Store Connect. ${groupUrl ?? ''}`);
117
+ }
118
+ else {
119
+ log_1.default.log(`TestFlight access enabled for: ` +
120
+ data.attributes.betaTesters
121
+ .map(tester => tester.email)
122
+ .filter(Boolean)
123
+ .join(', '));
124
+ // TODO: When we have more TestFlight functionality, we can link to it from here.
125
+ }
126
+ }
127
+ async function getTestFlightGroupUrlAsync(group) {
128
+ if (group.context.providerId) {
129
+ try {
130
+ const session = await apple_utils_1.Session.getSessionForProviderIdAsync(group.context.providerId);
131
+ return `https://appstoreconnect.apple.com/teams/${session.provider.publicProviderId}/apps/6741088859/testflight/groups/${group.id}`;
132
+ }
133
+ catch (error) {
134
+ // Avoid crashing if we can't get the session.
135
+ log_1.default.debug('Failed to get session for provider ID', error);
136
+ }
137
+ }
138
+ return null;
139
+ }
140
+ async function pollRetryAsync(fn, { shouldRetry, retries = 10,
141
+ // 25 seconds was the minium interval I calculated when measuring against 5 second intervals.
142
+ interval = 25000, } = {}) {
143
+ let lastError = null;
144
+ for (let i = 0; i < retries; i++) {
145
+ try {
146
+ return await fn();
147
+ }
148
+ catch (error) {
149
+ if (shouldRetry && !shouldRetry(error)) {
150
+ throw error;
151
+ }
152
+ lastError = error;
153
+ await new Promise(resolve => setTimeout(resolve, interval));
154
+ }
155
+ }
156
+ // eslint-disable-next-line @typescript-eslint/no-throw-literal
157
+ throw lastError;
158
+ }
@@ -20,6 +20,7 @@ function resolveProfileType(applePlatform, profileClass, isEnterprise) {
20
20
  return resolveProfileTypeIos(profileClass, isEnterprise);
21
21
  case constants_1.ApplePlatform.TV_OS:
22
22
  return resolveProfileTypeAppleTv(profileClass, isEnterprise);
23
+ case constants_1.ApplePlatform.VISION_OS:
23
24
  case constants_1.ApplePlatform.MAC_OS:
24
25
  throw new Error(`${applePlatform} profiles are not supported`);
25
26
  }
@@ -959,6 +959,7 @@ export type AndroidJobInput = {
959
959
  cache?: InputMaybe<BuildCacheInput>;
960
960
  customBuildConfig?: InputMaybe<CustomBuildConfigInput>;
961
961
  developmentClient?: InputMaybe<Scalars['Boolean']['input']>;
962
+ environment?: InputMaybe<EnvironmentVariableEnvironment>;
962
963
  experimental?: InputMaybe<Scalars['JSONObject']['input']>;
963
964
  gradleCommand?: InputMaybe<Scalars['String']['input']>;
964
965
  loggerLevel?: InputMaybe<WorkerLoggerLevel>;
@@ -1401,6 +1402,7 @@ export type AppUpdatesArgs = {
1401
1402
  export type AppUpdatesPaginatedArgs = {
1402
1403
  after?: InputMaybe<Scalars['String']['input']>;
1403
1404
  before?: InputMaybe<Scalars['String']['input']>;
1405
+ filter?: InputMaybe<UpdateFilterInput>;
1404
1406
  first?: InputMaybe<Scalars['Int']['input']>;
1405
1407
  last?: InputMaybe<Scalars['Int']['input']>;
1406
1408
  };
@@ -2460,7 +2462,7 @@ export type BuildArtifacts = {
2460
2462
  applicationArchiveUrl?: Maybe<Scalars['String']['output']>;
2461
2463
  buildArtifactsUrl?: Maybe<Scalars['String']['output']>;
2462
2464
  buildUrl?: Maybe<Scalars['String']['output']>;
2463
- /** @deprecated Use 'runtime.fingerprintDebugInfoUrl' instead. */
2465
+ /** @deprecated Use 'runtime.fingerprint.debugInfoUrl' instead. */
2464
2466
  fingerprintUrl?: Maybe<Scalars['String']['output']>;
2465
2467
  xcodeBuildLogsUrl?: Maybe<Scalars['String']['output']>;
2466
2468
  };
@@ -2487,6 +2489,7 @@ export type BuildFilter = {
2487
2489
  appVersion?: InputMaybe<Scalars['String']['input']>;
2488
2490
  buildProfile?: InputMaybe<Scalars['String']['input']>;
2489
2491
  channel?: InputMaybe<Scalars['String']['input']>;
2492
+ developmentClient?: InputMaybe<Scalars['Boolean']['input']>;
2490
2493
  distribution?: InputMaybe<DistributionType>;
2491
2494
  fingerprintHash?: InputMaybe<Scalars['String']['input']>;
2492
2495
  gitCommitHash?: InputMaybe<Scalars['String']['input']>;
@@ -3454,6 +3457,8 @@ export type EnvironmentVariableMutation = {
3454
3457
  createEnvironmentVariableForAccount: EnvironmentVariable;
3455
3458
  /** Create an environment variable for an App */
3456
3459
  createEnvironmentVariableForApp: EnvironmentVariable;
3460
+ /** Bulk delete environment variables */
3461
+ deleteBulkEnvironmentVariables: Array<DeleteEnvironmentVariableResult>;
3457
3462
  /** Delete an environment variable */
3458
3463
  deleteEnvironmentVariable: DeleteEnvironmentVariableResult;
3459
3464
  /** Bulk link shared environment variables */
@@ -3462,6 +3467,8 @@ export type EnvironmentVariableMutation = {
3462
3467
  linkSharedEnvironmentVariable: EnvironmentVariable;
3463
3468
  /** Unlink shared environment variable */
3464
3469
  unlinkSharedEnvironmentVariable: EnvironmentVariable;
3470
+ /** Bulk update environment variables */
3471
+ updateBulkEnvironmentVariables: Array<EnvironmentVariable>;
3465
3472
  /** Update an environment variable */
3466
3473
  updateEnvironmentVariable: EnvironmentVariable;
3467
3474
  };
@@ -3481,6 +3488,9 @@ export type EnvironmentVariableMutationCreateEnvironmentVariableForAppArgs = {
3481
3488
  appId: Scalars['ID']['input'];
3482
3489
  environmentVariableData: CreateEnvironmentVariableInput;
3483
3490
  };
3491
+ export type EnvironmentVariableMutationDeleteBulkEnvironmentVariablesArgs = {
3492
+ ids: Array<Scalars['ID']['input']>;
3493
+ };
3484
3494
  export type EnvironmentVariableMutationDeleteEnvironmentVariableArgs = {
3485
3495
  id: Scalars['ID']['input'];
3486
3496
  };
@@ -3497,6 +3507,9 @@ export type EnvironmentVariableMutationUnlinkSharedEnvironmentVariableArgs = {
3497
3507
  environment?: InputMaybe<EnvironmentVariableEnvironment>;
3498
3508
  environmentVariableId: Scalars['ID']['input'];
3499
3509
  };
3510
+ export type EnvironmentVariableMutationUpdateBulkEnvironmentVariablesArgs = {
3511
+ environmentVariablesData: Array<UpdateEnvironmentVariableInput>;
3512
+ };
3500
3513
  export type EnvironmentVariableMutationUpdateEnvironmentVariableArgs = {
3501
3514
  environmentVariableData: UpdateEnvironmentVariableInput;
3502
3515
  };
@@ -3691,6 +3704,7 @@ export declare enum GitHubAppEnvironment {
3691
3704
  }
3692
3705
  export type GitHubAppInstallation = {
3693
3706
  __typename?: 'GitHubAppInstallation';
3707
+ /** The Expo account that owns the installation entity. */
3694
3708
  account: Account;
3695
3709
  actor?: Maybe<Actor>;
3696
3710
  id: Scalars['ID']['output'];
@@ -3708,10 +3722,16 @@ export type GitHubAppInstallationAccessibleRepository = {
3708
3722
  private: Scalars['Boolean']['output'];
3709
3723
  url: Scalars['String']['output'];
3710
3724
  };
3725
+ export declare enum GitHubAppInstallationAccountType {
3726
+ Organization = "ORGANIZATION",
3727
+ User = "USER"
3728
+ }
3711
3729
  export type GitHubAppInstallationMetadata = {
3712
3730
  __typename?: 'GitHubAppInstallationMetadata';
3713
3731
  githubAccountAvatarUrl?: Maybe<Scalars['String']['output']>;
3732
+ /** The login of the GitHub account that owns the installation. Not the display name. */
3714
3733
  githubAccountName?: Maybe<Scalars['String']['output']>;
3734
+ githubAccountType?: Maybe<GitHubAppInstallationAccountType>;
3715
3735
  installationStatus: GitHubAppInstallationStatus;
3716
3736
  };
3717
3737
  export type GitHubAppInstallationMutation = {
@@ -4237,6 +4257,7 @@ export type IosJobInput = {
4237
4257
  developmentClient?: InputMaybe<Scalars['Boolean']['input']>;
4238
4258
  /** @deprecated */
4239
4259
  distribution?: InputMaybe<DistributionType>;
4260
+ environment?: InputMaybe<EnvironmentVariableEnvironment>;
4240
4261
  experimental?: InputMaybe<Scalars['JSONObject']['input']>;
4241
4262
  loggerLevel?: InputMaybe<WorkerLoggerLevel>;
4242
4263
  mode?: InputMaybe<BuildMode>;
@@ -4320,6 +4341,7 @@ export type IosSubmissionConfigInput = {
4320
4341
  export type JobRun = {
4321
4342
  __typename?: 'JobRun';
4322
4343
  app: App;
4344
+ artifacts: Array<WorkflowArtifact>;
4323
4345
  /** @deprecated No longer supported */
4324
4346
  childJobRun?: Maybe<JobRun>;
4325
4347
  createdAt: Scalars['DateTime']['output'];
@@ -4809,7 +4831,6 @@ export type PublishUpdateGroupInput = {
4809
4831
  message?: InputMaybe<Scalars['String']['input']>;
4810
4832
  rollBackToEmbeddedInfoGroup?: InputMaybe<UpdateRollBackToEmbeddedGroup>;
4811
4833
  rolloutInfoGroup?: InputMaybe<UpdateRolloutInfoGroup>;
4812
- runtimeFingerprintSource?: InputMaybe<FingerprintSourceInput>;
4813
4834
  runtimeVersion: Scalars['String']['input'];
4814
4835
  turtleJobRunId?: InputMaybe<Scalars['String']['input']>;
4815
4836
  updateInfoGroup?: InputMaybe<UpdateInfoGroup>;
@@ -5206,7 +5227,7 @@ export type Runtime = {
5206
5227
  builds: AppBuildsConnection;
5207
5228
  createdAt: Scalars['DateTime']['output'];
5208
5229
  deployments: DeploymentsConnection;
5209
- fingerprintDebugInfoUrl?: Maybe<Scalars['String']['output']>;
5230
+ fingerprint?: Maybe<Fingerprint>;
5210
5231
  firstBuildCreatedAt?: Maybe<Scalars['DateTime']['output']>;
5211
5232
  id: Scalars['ID']['output'];
5212
5233
  updatedAt: Scalars['DateTime']['output'];
@@ -5885,6 +5906,11 @@ export type UpdateEnvironmentVariableInput = {
5885
5906
  value?: InputMaybe<Scalars['String']['input']>;
5886
5907
  visibility?: InputMaybe<EnvironmentVariableVisibility>;
5887
5908
  };
5909
+ export type UpdateFilterInput = {
5910
+ fingerprintHash?: InputMaybe<Scalars['String']['input']>;
5911
+ hasFingerprint?: InputMaybe<Scalars['Boolean']['input']>;
5912
+ runtimeVersion?: InputMaybe<Scalars['String']['input']>;
5913
+ };
5888
5914
  export type UpdateGitHubBuildTriggerInput = {
5889
5915
  autoSubmit: Scalars['Boolean']['input'];
5890
5916
  buildProfile: Scalars['String']['input'];
@@ -6993,6 +7019,18 @@ export type WorkflowRunsPaginatedArgs = {
6993
7019
  first?: InputMaybe<Scalars['Int']['input']>;
6994
7020
  last?: InputMaybe<Scalars['Int']['input']>;
6995
7021
  };
7022
+ export type WorkflowArtifact = {
7023
+ __typename?: 'WorkflowArtifact';
7024
+ contentType?: Maybe<Scalars['String']['output']>;
7025
+ createdAt: Scalars['DateTime']['output'];
7026
+ downloadUrl?: Maybe<Scalars['String']['output']>;
7027
+ fileSizeBytes?: Maybe<Scalars['Int']['output']>;
7028
+ filename: Scalars['String']['output'];
7029
+ id: Scalars['ID']['output'];
7030
+ jobRun: JobRun;
7031
+ name: Scalars['String']['output'];
7032
+ updatedAt: Scalars['DateTime']['output'];
7033
+ };
6996
7034
  export type WorkflowJob = {
6997
7035
  __typename?: 'WorkflowJob';
6998
7036
  createdAt: Scalars['DateTime']['output'];
@@ -7158,6 +7196,7 @@ export type WorkflowRunMutationCreateWorkflowRunArgs = {
7158
7196
  workflowRunInput: WorkflowRunInput;
7159
7197
  };
7160
7198
  export type WorkflowRunMutationRetryWorkflowRunArgs = {
7199
+ fromFailedJobs?: InputMaybe<Scalars['Boolean']['input']>;
7161
7200
  workflowRunId: Scalars['ID']['input'];
7162
7201
  };
7163
7202
  export type WorkflowRunQuery = {
@@ -7178,6 +7217,10 @@ export declare enum WorkflowRunStatus {
7178
7217
  }
7179
7218
  export declare enum WorkflowRunTriggerEventType {
7180
7219
  Github = "GITHUB",
7220
+ GithubPullRequestOpened = "GITHUB_PULL_REQUEST_OPENED",
7221
+ GithubPullRequestReopened = "GITHUB_PULL_REQUEST_REOPENED",
7222
+ GithubPullRequestSynchronize = "GITHUB_PULL_REQUEST_SYNCHRONIZE",
7223
+ GithubPush = "GITHUB_PUSH",
7181
7224
  Manual = "MANUAL"
7182
7225
  }
7183
7226
  export type WorkflowRunsConnection = {
@@ -11558,6 +11601,28 @@ export type CreateFingeprintMutation = {
11558
11601
  id: string;
11559
11602
  hash: string;
11560
11603
  debugInfoUrl?: string | null;
11604
+ builds: {
11605
+ __typename?: 'AppBuildsConnection';
11606
+ edges: Array<{
11607
+ __typename?: 'AppBuildEdge';
11608
+ node: {
11609
+ __typename?: 'Build';
11610
+ platform: AppPlatform;
11611
+ id: string;
11612
+ };
11613
+ }>;
11614
+ };
11615
+ updates: {
11616
+ __typename?: 'AppUpdatesConnection';
11617
+ edges: Array<{
11618
+ __typename?: 'AppUpdateEdge';
11619
+ node: {
11620
+ __typename?: 'Update';
11621
+ id: string;
11622
+ platform: string;
11623
+ };
11624
+ }>;
11625
+ };
11561
11626
  };
11562
11627
  };
11563
11628
  };
@@ -12547,6 +12612,28 @@ export type BuildsWithFingerprintByIdQuery = {
12547
12612
  id: string;
12548
12613
  hash: string;
12549
12614
  debugInfoUrl?: string | null;
12615
+ builds: {
12616
+ __typename?: 'AppBuildsConnection';
12617
+ edges: Array<{
12618
+ __typename?: 'AppBuildEdge';
12619
+ node: {
12620
+ __typename?: 'Build';
12621
+ platform: AppPlatform;
12622
+ id: string;
12623
+ };
12624
+ }>;
12625
+ };
12626
+ updates: {
12627
+ __typename?: 'AppUpdatesConnection';
12628
+ edges: Array<{
12629
+ __typename?: 'AppUpdateEdge';
12630
+ node: {
12631
+ __typename?: 'Update';
12632
+ id: string;
12633
+ platform: string;
12634
+ };
12635
+ }>;
12636
+ };
12550
12637
  } | null;
12551
12638
  error?: {
12552
12639
  __typename?: 'BuildError';
@@ -13035,6 +13122,65 @@ export type EnvironmentVariablesSharedWithSensitiveQuery = {
13035
13122
  };
13036
13123
  };
13037
13124
  };
13125
+ export type FingerprintsByAppIdQueryVariables = Exact<{
13126
+ appId: Scalars['String']['input'];
13127
+ after?: InputMaybe<Scalars['String']['input']>;
13128
+ first?: InputMaybe<Scalars['Int']['input']>;
13129
+ before?: InputMaybe<Scalars['String']['input']>;
13130
+ last?: InputMaybe<Scalars['Int']['input']>;
13131
+ fingerprintFilter?: InputMaybe<FingerprintFilterInput>;
13132
+ }>;
13133
+ export type FingerprintsByAppIdQuery = {
13134
+ __typename?: 'RootQuery';
13135
+ app: {
13136
+ __typename?: 'AppQuery';
13137
+ byId: {
13138
+ __typename?: 'App';
13139
+ id: string;
13140
+ fingerprintsPaginated: {
13141
+ __typename?: 'AppFingerprintsConnection';
13142
+ edges: Array<{
13143
+ __typename?: 'AppFingerprintEdge';
13144
+ node: {
13145
+ __typename?: 'Fingerprint';
13146
+ id: string;
13147
+ hash: string;
13148
+ debugInfoUrl?: string | null;
13149
+ builds: {
13150
+ __typename?: 'AppBuildsConnection';
13151
+ edges: Array<{
13152
+ __typename?: 'AppBuildEdge';
13153
+ node: {
13154
+ __typename?: 'Build';
13155
+ platform: AppPlatform;
13156
+ id: string;
13157
+ };
13158
+ }>;
13159
+ };
13160
+ updates: {
13161
+ __typename?: 'AppUpdatesConnection';
13162
+ edges: Array<{
13163
+ __typename?: 'AppUpdateEdge';
13164
+ node: {
13165
+ __typename?: 'Update';
13166
+ id: string;
13167
+ platform: string;
13168
+ };
13169
+ }>;
13170
+ };
13171
+ };
13172
+ }>;
13173
+ pageInfo: {
13174
+ __typename?: 'PageInfo';
13175
+ hasNextPage: boolean;
13176
+ hasPreviousPage: boolean;
13177
+ startCursor?: string | null;
13178
+ endCursor?: string | null;
13179
+ };
13180
+ };
13181
+ };
13182
+ };
13183
+ };
13038
13184
  export type GoogleServiceAccountKeyByIdQueryVariables = Exact<{
13039
13185
  ascApiKeyId: Scalars['ID']['input'];
13040
13186
  }>;
@@ -13941,6 +14087,28 @@ export type BuildWithFingerprintFragment = {
13941
14087
  id: string;
13942
14088
  hash: string;
13943
14089
  debugInfoUrl?: string | null;
14090
+ builds: {
14091
+ __typename?: 'AppBuildsConnection';
14092
+ edges: Array<{
14093
+ __typename?: 'AppBuildEdge';
14094
+ node: {
14095
+ __typename?: 'Build';
14096
+ platform: AppPlatform;
14097
+ id: string;
14098
+ };
14099
+ }>;
14100
+ };
14101
+ updates: {
14102
+ __typename?: 'AppUpdatesConnection';
14103
+ edges: Array<{
14104
+ __typename?: 'AppUpdateEdge';
14105
+ node: {
14106
+ __typename?: 'Update';
14107
+ id: string;
14108
+ platform: string;
14109
+ };
14110
+ }>;
14111
+ };
13944
14112
  } | null;
13945
14113
  error?: {
13946
14114
  __typename?: 'BuildError';
@@ -14021,6 +14189,28 @@ export type FingerprintFragment = {
14021
14189
  id: string;
14022
14190
  hash: string;
14023
14191
  debugInfoUrl?: string | null;
14192
+ builds: {
14193
+ __typename?: 'AppBuildsConnection';
14194
+ edges: Array<{
14195
+ __typename?: 'AppBuildEdge';
14196
+ node: {
14197
+ __typename?: 'Build';
14198
+ platform: AppPlatform;
14199
+ id: string;
14200
+ };
14201
+ }>;
14202
+ };
14203
+ updates: {
14204
+ __typename?: 'AppUpdatesConnection';
14205
+ edges: Array<{
14206
+ __typename?: 'AppUpdateEdge';
14207
+ node: {
14208
+ __typename?: 'Update';
14209
+ id: string;
14210
+ platform: string;
14211
+ };
14212
+ }>;
14213
+ };
14024
14214
  };
14025
14215
  export type RuntimeFragment = {
14026
14216
  __typename?: 'Runtime';
@@ -7,8 +7,8 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.Feature = exports.Experiment = exports.EnvironmentVariableVisibility = exports.EnvironmentVariableScope = exports.EnvironmentVariableEnvironment = exports.EnvironmentSecretType = exports.EntityTypeName = exports.EasTotalPlanEnablementUnit = exports.EasServiceMetric = exports.EasService = exports.EasBuildWaiverType = exports.EasBuildDeprecationInfoType = exports.EasBuildBillingResourceClass = exports.DistributionType = exports.CustomDomainStatus = exports.CustomDomainDnsRecordType = exports.CrashSampleFor = exports.ContinentCode = exports.BuildWorkflow = exports.BuildTrigger = exports.BuildStatus = exports.BuildRetryDisabledReason = exports.BuildResourceClass = exports.BuildPriority = exports.BuildPhase = exports.BuildMode = exports.BuildLimitThresholdExceededMetadataType = exports.BuildIosEnterpriseProvisioning = exports.BuildCredentialsSource = exports.BackgroundJobState = exports.BackgroundJobResultType = exports.AuthProviderIdentifier = exports.AuthProtocolType = exports.AuditLogsExportFormat = exports.AssetMetadataStatus = exports.AppsFilter = exports.AppleTeamType = exports.AppleDeviceClass = exports.AppUploadSessionType = exports.AppStoreConnectUserRole = exports.AppSort = exports.AppPrivacy = exports.AppPlatform = exports.AppInternalDistributionBuildPrivacy = exports.AndroidKeystoreType = exports.AndroidFcmVersion = exports.AndroidBuildType = exports.ActivityTimelineProjectActivityType = exports.AccountUploadSessionType = exports.AccountAppsSortByField = void 0;
10
- exports.UsageMetricType = exports.UploadSessionType = exports.TargetEntityMutationType = exports.SubmissionStatus = exports.SubmissionPriority = exports.SubmissionArchiveSourceType = exports.SubmissionAndroidTrack = exports.SubmissionAndroidReleaseStatus = exports.SubmissionAndroidArchiveType = exports.StatuspageServiceStatus = exports.StatuspageServiceName = exports.StatuspageIncidentStatus = exports.StatuspageIncidentImpact = exports.StandardOffer = exports.SecondFactorMethod = exports.Role = exports.ResponseType = exports.ResponseStatusType = exports.ResponseCacheStatus = exports.ResourceClassExperiment = exports.RequestsOrderByField = exports.RequestsOrderByDirection = exports.RequestMethod = exports.ProjectArchiveSourceType = exports.Permission = exports.Order = exports.OnboardingEnvironment = exports.OnboardingDeviceType = exports.OfferType = exports.NotificationType = exports.NotificationEvent = exports.MailchimpTag = exports.MailchimpAudience = exports.JobRunStatus = exports.JobRunPriority = exports.IosSchemeBuildConfiguration = exports.IosManagedBuildType = exports.IosDistributionType = exports.IosBuildType = exports.InvoiceDiscountType = exports.InsightsFilterType = exports.GitHubJobRunTriggerType = exports.GitHubJobRunTriggerRunStatus = exports.GitHubJobRunJobType = exports.GitHubBuildTriggerType = exports.GitHubBuildTriggerRunStatus = exports.GitHubBuildTriggerExecutionBehavior = exports.GitHubAppInstallationStatus = exports.GitHubAppEnvironment = exports.FingerprintSourceType = void 0;
11
- exports.WorkflowRunTriggerEventType = exports.WorkflowRunStatus = exports.WorkflowProjectSourceType = exports.WorkflowJobType = exports.WorkflowJobStatus = exports.WorkerLoggerLevel = exports.WorkerDeploymentLogLevel = exports.WorkerDeploymentCrashKind = exports.WebhookType = exports.UserEntityTypeName = exports.UserAgentOs = exports.UserAgentBrowser = exports.UsageMetricsGranularity = void 0;
10
+ exports.UploadSessionType = exports.TargetEntityMutationType = exports.SubmissionStatus = exports.SubmissionPriority = exports.SubmissionArchiveSourceType = exports.SubmissionAndroidTrack = exports.SubmissionAndroidReleaseStatus = exports.SubmissionAndroidArchiveType = exports.StatuspageServiceStatus = exports.StatuspageServiceName = exports.StatuspageIncidentStatus = exports.StatuspageIncidentImpact = exports.StandardOffer = exports.SecondFactorMethod = exports.Role = exports.ResponseType = exports.ResponseStatusType = exports.ResponseCacheStatus = exports.ResourceClassExperiment = exports.RequestsOrderByField = exports.RequestsOrderByDirection = exports.RequestMethod = exports.ProjectArchiveSourceType = exports.Permission = exports.Order = exports.OnboardingEnvironment = exports.OnboardingDeviceType = exports.OfferType = exports.NotificationType = exports.NotificationEvent = exports.MailchimpTag = exports.MailchimpAudience = exports.JobRunStatus = exports.JobRunPriority = exports.IosSchemeBuildConfiguration = exports.IosManagedBuildType = exports.IosDistributionType = exports.IosBuildType = exports.InvoiceDiscountType = exports.InsightsFilterType = exports.GitHubJobRunTriggerType = exports.GitHubJobRunTriggerRunStatus = exports.GitHubJobRunJobType = exports.GitHubBuildTriggerType = exports.GitHubBuildTriggerRunStatus = exports.GitHubBuildTriggerExecutionBehavior = exports.GitHubAppInstallationStatus = exports.GitHubAppInstallationAccountType = exports.GitHubAppEnvironment = exports.FingerprintSourceType = void 0;
11
+ exports.WorkflowRunTriggerEventType = exports.WorkflowRunStatus = exports.WorkflowProjectSourceType = exports.WorkflowJobType = exports.WorkflowJobStatus = exports.WorkerLoggerLevel = exports.WorkerDeploymentLogLevel = exports.WorkerDeploymentCrashKind = exports.WebhookType = exports.UserEntityTypeName = exports.UserAgentOs = exports.UserAgentBrowser = exports.UsageMetricsGranularity = exports.UsageMetricType = void 0;
12
12
  var AccountAppsSortByField;
13
13
  (function (AccountAppsSortByField) {
14
14
  AccountAppsSortByField["LatestActivityTime"] = "LATEST_ACTIVITY_TIME";
@@ -422,6 +422,11 @@ var GitHubAppEnvironment;
422
422
  GitHubAppEnvironment["Production"] = "PRODUCTION";
423
423
  GitHubAppEnvironment["Staging"] = "STAGING";
424
424
  })(GitHubAppEnvironment || (exports.GitHubAppEnvironment = GitHubAppEnvironment = {}));
425
+ var GitHubAppInstallationAccountType;
426
+ (function (GitHubAppInstallationAccountType) {
427
+ GitHubAppInstallationAccountType["Organization"] = "ORGANIZATION";
428
+ GitHubAppInstallationAccountType["User"] = "USER";
429
+ })(GitHubAppInstallationAccountType || (exports.GitHubAppInstallationAccountType = GitHubAppInstallationAccountType = {}));
425
430
  var GitHubAppInstallationStatus;
426
431
  (function (GitHubAppInstallationStatus) {
427
432
  GitHubAppInstallationStatus["Active"] = "ACTIVE";
@@ -876,5 +881,9 @@ var WorkflowRunStatus;
876
881
  var WorkflowRunTriggerEventType;
877
882
  (function (WorkflowRunTriggerEventType) {
878
883
  WorkflowRunTriggerEventType["Github"] = "GITHUB";
884
+ WorkflowRunTriggerEventType["GithubPullRequestOpened"] = "GITHUB_PULL_REQUEST_OPENED";
885
+ WorkflowRunTriggerEventType["GithubPullRequestReopened"] = "GITHUB_PULL_REQUEST_REOPENED";
886
+ WorkflowRunTriggerEventType["GithubPullRequestSynchronize"] = "GITHUB_PULL_REQUEST_SYNCHRONIZE";
887
+ WorkflowRunTriggerEventType["GithubPush"] = "GITHUB_PUSH";
879
888
  WorkflowRunTriggerEventType["Manual"] = "MANUAL";
880
889
  })(WorkflowRunTriggerEventType || (exports.WorkflowRunTriggerEventType = WorkflowRunTriggerEventType = {}));
@@ -0,0 +1,16 @@
1
+ import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient';
2
+ import { FingerprintFilterInput, FingerprintFragment, FingerprintsByAppIdQuery } from '../generated';
3
+ export declare const FingerprintQuery: {
4
+ byHashAsync(graphqlClient: ExpoGraphqlClient, { appId, hash, }: {
5
+ appId: string;
6
+ hash: string;
7
+ }): Promise<FingerprintFragment | null>;
8
+ getFingerprintsAsync(graphqlClient: ExpoGraphqlClient, { appId, first, after, last, before, fingerprintFilter, }: {
9
+ appId: string;
10
+ first?: number | undefined;
11
+ after?: string | undefined;
12
+ last?: number | undefined;
13
+ before?: string | undefined;
14
+ fingerprintFilter?: FingerprintFilterInput | undefined;
15
+ }): Promise<FingerprintsByAppIdQuery['app']['byId']['fingerprintsPaginated']>;
16
+ };
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FingerprintQuery = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const graphql_1 = require("graphql");
6
+ const graphql_tag_1 = tslib_1.__importDefault(require("graphql-tag"));
7
+ const client_1 = require("../client");
8
+ const Fingerprint_1 = require("../types/Fingerprint");
9
+ exports.FingerprintQuery = {
10
+ async byHashAsync(graphqlClient, { appId, hash, }) {
11
+ const fingerprintConnection = await exports.FingerprintQuery.getFingerprintsAsync(graphqlClient, {
12
+ appId,
13
+ fingerprintFilter: { hashes: [hash] },
14
+ first: 1,
15
+ });
16
+ const fingerprints = fingerprintConnection.edges.map(edge => edge.node);
17
+ return fingerprints[0] ?? null;
18
+ },
19
+ async getFingerprintsAsync(graphqlClient, { appId, first, after, last, before, fingerprintFilter, }) {
20
+ const data = await (0, client_1.withErrorHandlingAsync)(graphqlClient
21
+ .query((0, graphql_tag_1.default) `
22
+ query FingerprintsByAppId(
23
+ $appId: String!
24
+ $after: String
25
+ $first: Int
26
+ $before: String
27
+ $last: Int
28
+ $fingerprintFilter: FingerprintFilterInput
29
+ ) {
30
+ app {
31
+ byId(appId: $appId) {
32
+ id
33
+ fingerprintsPaginated(
34
+ after: $after
35
+ first: $first
36
+ before: $before
37
+ last: $last
38
+ filter: $fingerprintFilter
39
+ ) {
40
+ edges {
41
+ node {
42
+ id
43
+ ...FingerprintFragment
44
+ }
45
+ }
46
+ pageInfo {
47
+ hasNextPage
48
+ hasPreviousPage
49
+ startCursor
50
+ endCursor
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ ${(0, graphql_1.print)(Fingerprint_1.FingerprintFragmentNode)}
57
+ `, { appId, after, first, before, last, fingerprintFilter }, { additionalTypenames: ['Fingerprint'] })
58
+ .toPromise());
59
+ return data.app?.byId.fingerprintsPaginated;
60
+ },
61
+ };
@@ -8,5 +8,23 @@ exports.FingerprintFragmentNode = (0, graphql_tag_1.default) `
8
8
  id
9
9
  hash
10
10
  debugInfoUrl
11
+ builds(first: 1) {
12
+ edges {
13
+ node {
14
+ id
15
+ ... on Build {
16
+ platform
17
+ }
18
+ }
19
+ }
20
+ }
21
+ updates(first: 1) {
22
+ edges {
23
+ node {
24
+ id
25
+ platform
26
+ }
27
+ }
28
+ }
11
29
  }
12
30
  `;
@@ -0,0 +1,7 @@
1
+ import { ExpoConfig } from '@expo/config';
2
+ /** Non-exempt encryption must be set on every build in App Store Connect, we move it to before the build process to attempt only setting it once for the entire life-cycle of the project. */
3
+ export declare function ensureNonExemptEncryptionIsDefinedForManagedProjectAsync({ projectDir, exp, nonInteractive, }: {
4
+ projectDir: string;
5
+ exp: ExpoConfig;
6
+ nonInteractive: boolean;
7
+ }): Promise<void>;