Compare commits

..
Author SHA1 Message Date
Quinlan Jung f20d970616 tmp 2024-05-20 15:55:47 +02:00
Quinlan Jung f3712d5dfb amend apple team 2024-05-20 15:55:47 +02:00
Quinlan Jung cba211d82c manage asc api key 2024-05-20 15:55:19 +02:00
7 changed files with 6083 additions and 903 deletions

No files matched your search

+10 -24
View File
@@ -22838,6 +22838,16 @@
"enumValues": null,
"possibleTypes": null
},
{
"kind": "SCALAR",
"name": "DevDomainName",
"description": "A DevDomainName for a deployed serverless app",
"fields": null,
"inputFields": null,
"interfaces": null,
"enumValues": null,
"possibleTypes": null
},
{
"kind": "OBJECT",
"name": "DeploymentsMutation",
@@ -25024,18 +25034,6 @@
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "repack",
"description": "Repack the golden dev client build instead of running full build process. Used for onboarding. Do not use outside of onboarding flow, as for now it's only created with this specific use case in mind.",
"type": {
"kind": "SCALAR",
"name": "Boolean",
"ofType": null
},
"defaultValue": null,
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "submitProfile",
"description": null,
@@ -29854,18 +29852,6 @@
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "gitCommitMessage",
"description": null,
"args": [],
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "gitRef",
"description": null,
+6 -4
View File
@@ -16,6 +16,7 @@ import { Analytics, AnalyticsEventProperties, BuildEvent } from '../analytics/An
import { DynamicConfigContextFn } from '../commandUtils/context/DynamicProjectConfigContextField';
import { ExpoGraphqlClient } from '../commandUtils/context/contextUtils/createGraphqlClient';
import { CredentialsContext } from '../credentials/context';
import { AppStoreApiKeyPurpose } from '../credentials/ios/actions/AscApiKeyUtils';
import { getAppFromContextAsync } from '../credentials/ios/actions/BuildCredentialsUtils';
import { GetAscApiKey } from '../credentials/ios/actions/GetAscApiKey';
import { CustomBuildConfigMetadata } from '../project/customBuildConfig';
@@ -165,12 +166,13 @@ export async function createBuildContextAsync<T extends Platform>({
...(await getAppFromContextAsync(credentialsCtx)),
bundleIdentifier: (iosBuildCtx as BuildContext<Platform.IOS>).ios.bundleIdentifier,
};
const ascForBuilds = await GetAscApiKey.getForBuildServiceAsync(
const getAscApiKeyAction = new GetAscApiKey(
appLookupParams,
credentialsCtx
AppStoreApiKeyPurpose.BUILD_SERVICE
);
if (ascForBuilds) {
credentialsCtx.configureAppStoreAuth(ascForBuilds);
const ascApiKeyManagedByExpo = await getAscApiKeyAction.runAsync(credentialsCtx);
if (ascApiKeyManagedByExpo) {
// TODO: set credentialCtx with the correct options
}
return iosBuildCtx;
+13 -5
View File
@@ -7,9 +7,10 @@ import * as AndroidGraphqlClient from './android/api/GraphqlClient';
import * as IosGraphqlClient from './ios/api/GraphqlClient';
import AppStoreApi from './ios/appstore/AppStoreApi';
import { AuthenticationMode } from './ios/appstore/authenticateTypes';
import { MinimalAscApiKey } from './ios/credentials';
import { Analytics } from '../analytics/AnalyticsManager';
import { ExpoGraphqlClient } from '../commandUtils/context/contextUtils/createGraphqlClient';
import { AppStoreConnectApiKeyFragment, AppleTeamType } from '../graphql/generated';
import { AppStoreConnectApiKeyFragment } from '../graphql/generated';
import Log from '../log';
import { getPrivateExpoConfig } from '../project/expoConfig';
import { confirmAsync } from '../prompts';
@@ -87,16 +88,23 @@ export class CredentialsContext {
}
public configureAppStoreAuth(ascApiKey: AppStoreConnectApiKeyFragment): void {
/* keyP8: string;
keyId: string;
issuerId: string;
teamId?: string;
teamName?: string;
roles?: UserRole[];
name?: string; */
this.appStore.authCtx = {
ascApiKey: {
keyP8: ascApiKey.keyP8,
keyId: ascApiKey.keyIdentifier,
issuerId: ascApiKey.issuerIdentifier,
},
team: {
id: ascApiKey.appleTeam?.appleTeamIdentifier ?? '',
name: ascApiKey.appleTeam?.appleTeamName ?? undefined,
inHouse: ascApiKey.appleTeam?.appleTeamType === AppleTeamType.InHouse ?? false,
appleTeam: {
teamIdentifier: ascApiKey.appleTeam?.appleTeamIdentifier ?? '',
teamName: ascApiKey.appleTeam?.appleTeamName,
teamType: ascApiKey.appleTeam,
},
};
}
@@ -1,32 +1,39 @@
import { AppStoreApiKeyPurpose } from './AscApiKeyUtils';
import { AppStoreConnectApiKeyFragment } from '../../../graphql/generated';
import Log from '../../../log';
import { CredentialsContext } from '../../context';
import { AppLookupParams } from '../api/graphql/types/AppLookupParams';
export class GetAscApiKey {
static async getForBuildServiceAsync(
app: AppLookupParams,
ctx: CredentialsContext
): Promise<AppStoreConnectApiKeyFragment | null> {
constructor(
private app: AppLookupParams,
private purpose: AppStoreApiKeyPurpose
) {}
public async runAsync(ctx: CredentialsContext): Promise<AppStoreConnectApiKeyFragment | null> {
const appCredentials = await ctx.ios.getIosAppCredentialsWithCommonFieldsAsync(
ctx.graphqlClient,
app
this.app
);
const ascApiKey = appCredentials?.appStoreConnectApiKeyForBuilds;
if (!ascApiKey) {
return null;
if (this.purpose === AppStoreApiKeyPurpose.SUBMISSION_SERVICE) {
return appCredentials?.appStoreConnectApiKeyForSubmissions ?? null;
} else if (this.purpose === AppStoreApiKeyPurpose.BUILD_SERVICE) {
const ascApiKey = appCredentials?.appStoreConnectApiKeyForBuilds;
if (!ascApiKey) {
return null;
}
const appleTeam = ascApiKey.appleTeam;
const hasAppleTeamInfo =
!!appleTeam && !!appleTeam.appleTeamIdentifier && !!appleTeam.appleTeamType;
if (!hasAppleTeamInfo) {
Log.warn(
`App Store Connect API Key for ${this.purpose} is missing Apple Team information. Run "eas credentials" and select "Use an existing API Key" to update the missing information.`
);
return null;
}
return ascApiKey;
} else {
throw new Error(`App Store Connect API Keys are not yet supported for ${this.purpose}.`);
}
const appleTeam = ascApiKey.appleTeam;
const appleTeamIdentifier = appleTeam?.appleTeamIdentifier;
const appleTeamType = appleTeam?.appleTeamType;
const hasAppleTeamInfo = !!appleTeamIdentifier && !!appleTeamType;
if (!hasAppleTeamInfo) {
Log.warn(
`App Store Connect API Key for EAS Build is missing Apple Team information. Run "eas credentials" and select "Use an existing API Key" to update the missing information.`
);
return null;
}
return ascApiKey;
}
}
@@ -49,7 +49,7 @@ import { AppleTeamType } from '../../../graphql/generated';
import Log from '../../../log';
import { MinimalAscApiKey } from '../credentials';
export type AscApiKeyAuth = {
type AscApiKeyAuth = {
ascApiKey: MinimalAscApiKey;
appleTeam: { teamIdentifier: string; teamName?: string; teamType: AppleTeamType };
};
+6026 -848
View File
File diff suppressed because it is too large. Load diff
@@ -12,7 +12,6 @@ export const AppStoreConnectApiKeyFragmentNode = gql`
}
issuerIdentifier
keyIdentifier
keyP8
name
roles
createdAt