From e1240507b7af2576dc6c1795ad23bb836f90d9e5 Mon Sep 17 00:00:00 2001 From: Quinlan Jung Date: Wed, 23 Jun 2021 14:18:12 -0700 Subject: [PATCH 1/2] [eas-cli] make apple team optional in appropriate cases --- packages/eas-cli/graphql.schema.json | 40 +++++++++++++++---- .../ios/actions/AppleAppIdentifierUtils.ts | 4 ++ .../credentials/ios/actions/AssignPushKey.ts | 9 +---- .../__tests__/AppleAppIdentifierUtils-test.ts | 13 ++++++ .../src/credentials/ios/api/GraphqlClient.ts | 21 +++++----- packages/eas-cli/src/graphql/generated.ts | 6 ++- 6 files changed, 67 insertions(+), 26 deletions(-) create mode 100644 packages/eas-cli/src/credentials/ios/actions/AppleAppIdentifierUtils.ts create mode 100644 packages/eas-cli/src/credentials/ios/actions/__tests__/AppleAppIdentifierUtils-test.ts diff --git a/packages/eas-cli/graphql.schema.json b/packages/eas-cli/graphql.schema.json index 24d7ec074c..411b2c1db0 100644 --- a/packages/eas-cli/graphql.schema.json +++ b/packages/eas-cli/graphql.schema.json @@ -7934,6 +7934,30 @@ }, "isDeprecated": false, "deprecationReason": null + }, + { + "name": "iosAppCredentialsList", + "description": "", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "IosAppCredentials", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null } ], "inputFields": null, @@ -17397,13 +17421,9 @@ "name": "appleTeamId", "description": "", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } + "kind": "SCALAR", + "name": "ID", + "ofType": null }, "defaultValue": null }, @@ -20249,6 +20269,12 @@ "description": "", "isDeprecated": false, "deprecationReason": null + }, + { + "name": "DEV_CLIENT_USERS", + "description": "", + "isDeprecated": false, + "deprecationReason": null } ], "possibleTypes": null diff --git a/packages/eas-cli/src/credentials/ios/actions/AppleAppIdentifierUtils.ts b/packages/eas-cli/src/credentials/ios/actions/AppleAppIdentifierUtils.ts new file mode 100644 index 0000000000..dcde9d5653 --- /dev/null +++ b/packages/eas-cli/src/credentials/ios/actions/AppleAppIdentifierUtils.ts @@ -0,0 +1,4 @@ +export function isWildcardBundleIdentifier(bundleIdentifier: string): boolean { + const wildcardRegex = /^[A-Za-z0-9.-]+\*$/; + return wildcardRegex.test(bundleIdentifier); +} diff --git a/packages/eas-cli/src/credentials/ios/actions/AssignPushKey.ts b/packages/eas-cli/src/credentials/ios/actions/AssignPushKey.ts index 41642baa4d..d5f99468dd 100644 --- a/packages/eas-cli/src/credentials/ios/actions/AssignPushKey.ts +++ b/packages/eas-cli/src/credentials/ios/actions/AssignPushKey.ts @@ -2,7 +2,6 @@ import { ApplePushKeyFragment, CommonIosAppCredentialsFragment } from '../../../ import Log from '../../../log'; import { Context } from '../../context'; import { AppLookupParams } from '../api/GraphqlClient'; -import { AppleTeamMissingError } from '../errors'; import { resolveAppleTeamIfAuthenticatedAsync } from './AppleTeamUtils'; export class AssignPushKey { @@ -14,15 +13,9 @@ export class AssignPushKey { ): Promise { const appleTeam = (await resolveAppleTeamIfAuthenticatedAsync(ctx, this.app)) ?? pushKey.appleTeam ?? null; - if (!appleTeam) { - // TODO(quin): make this optional - throw new AppleTeamMissingError( - 'An Apple Team is required to proceed. You must be authenticated to your Apple account' - ); - } const appCredentials = await ctx.ios.createOrGetIosAppCredentialsWithCommonFieldsAsync( this.app, - { appleTeam } + { appleTeam: appleTeam ?? undefined } ); const updatedAppCredentials = await ctx.ios.updateIosAppCredentialsAsync(appCredentials, { applePushKeyId: pushKey.id, diff --git a/packages/eas-cli/src/credentials/ios/actions/__tests__/AppleAppIdentifierUtils-test.ts b/packages/eas-cli/src/credentials/ios/actions/__tests__/AppleAppIdentifierUtils-test.ts new file mode 100644 index 0000000000..44ef1e8779 --- /dev/null +++ b/packages/eas-cli/src/credentials/ios/actions/__tests__/AppleAppIdentifierUtils-test.ts @@ -0,0 +1,13 @@ +import { isWildcardBundleIdentifier } from '../AppleAppIdentifierUtils'; + +describe(isWildcardBundleIdentifier, () => { + it('classifies wildcard bundle identifiers correctly', async () => { + expect(isWildcardBundleIdentifier('doge.doge.*')).toBe(true); + expect(isWildcardBundleIdentifier('doge*')).toBe(true); + + expect(isWildcardBundleIdentifier('*')).toBe(false); + expect(isWildcardBundleIdentifier('*.doge')).toBe(false); + expect(isWildcardBundleIdentifier('doge')).toBe(false); + expect(isWildcardBundleIdentifier('doge.doge.doge')).toBe(false); + }); +}); diff --git a/packages/eas-cli/src/credentials/ios/api/GraphqlClient.ts b/packages/eas-cli/src/credentials/ios/api/GraphqlClient.ts index 480d88bdc1..c4f24595e0 100644 --- a/packages/eas-cli/src/credentials/ios/api/GraphqlClient.ts +++ b/packages/eas-cli/src/credentials/ios/api/GraphqlClient.ts @@ -12,6 +12,7 @@ import { IosDistributionType, } from '../../../graphql/generated'; import { Account } from '../../../user/Account'; +import { isWildcardBundleIdentifier } from '../actions/AppleAppIdentifierUtils'; import { DistributionCertificate, PushKey } from '../appstore/Credentials.types'; import { AppleTeamMissingError } from '../errors'; import { AppleAppIdentifierMutation } from './graphql/mutations/AppleAppIdentifierMutation'; @@ -138,7 +139,7 @@ export async function createOrGetIosAppCredentialsWithCommonFieldsAsync( { appleTeam, }: { - appleTeam: AppleTeamFragment; + appleTeam?: AppleTeamFragment; } ): Promise { const maybeIosAppCredentials = await getIosAppCredentialsWithCommonFieldsAsync(appLookupParams); @@ -147,10 +148,10 @@ export async function createOrGetIosAppCredentialsWithCommonFieldsAsync( } const [app, appleAppIdentifier] = await Promise.all([ getAppAsync(appLookupParams), - createOrGetExistingAppleAppIdentifierAsync(appLookupParams, appleTeam), + createOrGetExistingAppleAppIdentifierAsync(appLookupParams, appleTeam ?? null), ]); return await IosAppCredentialsMutation.createIosAppCredentialsAsync( - { appleTeamId: appleTeam.id }, + { appleTeamId: appleTeam?.id }, app.id, appleAppIdentifier.id ); @@ -181,7 +182,7 @@ async function createOrGetExistingIosAppCredentialsWithBuildCredentialsAsync( appleAppIdentifierId, iosDistributionType, }: { - appleTeam: AppleTeamFragment; + appleTeam?: AppleTeamFragment; appleAppIdentifierId: string; iosDistributionType: IosDistributionType; } @@ -197,10 +198,10 @@ async function createOrGetExistingIosAppCredentialsWithBuildCredentialsAsync( } else { const [app, appleAppIdentifier] = await Promise.all([ getAppAsync(appLookupParams), - createOrGetExistingAppleAppIdentifierAsync(appLookupParams, appleTeam), + createOrGetExistingAppleAppIdentifierAsync(appLookupParams, appleTeam ?? null), ]); await IosAppCredentialsMutation.createIosAppCredentialsAsync( - { appleTeamId: appleTeam.id }, + { appleTeamId: appleTeam?.id }, app.id, appleAppIdentifier.id ); @@ -243,8 +244,10 @@ export async function createOrGetExistingAppleAppIdentifierAsync( if (appleAppIdentifier) { return appleAppIdentifier; } else { - if (!appleTeam) { - throw new AppleTeamMissingError(); + if (isWildcardBundleIdentifier(bundleIdentifier) && !appleTeam) { + throw new AppleTeamMissingError( + `An Apple Team is required for wildcard bundle identifier: ${bundleIdentifier}` + ); } const parentAppleAppIdentifier = parentBundleIdentifier ? await createOrGetExistingAppleAppIdentifierAsync( @@ -255,7 +258,7 @@ export async function createOrGetExistingAppleAppIdentifierAsync( return await AppleAppIdentifierMutation.createAppleAppIdentifierAsync( { bundleIdentifier, - appleTeamId: appleTeam.id, + appleTeamId: appleTeam?.id, parentAppleAppId: parentAppleAppIdentifier?.id, }, account.id diff --git a/packages/eas-cli/src/graphql/generated.ts b/packages/eas-cli/src/graphql/generated.ts index bc1224993a..2c0015d64d 100644 --- a/packages/eas-cli/src/graphql/generated.ts +++ b/packages/eas-cli/src/graphql/generated.ts @@ -1092,6 +1092,7 @@ export type ApplePushKey = { keyP8: Scalars['String']; createdAt: Scalars['DateTime']; updatedAt: Scalars['DateTime']; + iosAppCredentialsList: Array; }; export type IosAppBuildCredentialsFilter = { @@ -2650,7 +2651,7 @@ export type IosAppCredentialsMutationSetAppSpecificPasswordArgs = { }; export type IosAppCredentialsInput = { - appleTeamId: Scalars['ID']; + appleTeamId?: Maybe; pushKeyId?: Maybe; appSpecificPasswordId?: Maybe; }; @@ -3182,7 +3183,8 @@ export type AddUserInput = { }; export enum MailchimpTag { - EasMasterList = 'EAS_MASTER_LIST' + EasMasterList = 'EAS_MASTER_LIST', + DevClientUsers = 'DEV_CLIENT_USERS' } export enum MailchimpAudience { From bef4f3692e3866249c904c87bd17893f15a98e41 Mon Sep 17 00:00:00 2001 From: Quinlan Jung Date: Fri, 25 Jun 2021 13:42:08 -0700 Subject: [PATCH 2/2] pr feedback --- .../ios/actions/AppleAppIdentifierUtils.ts | 4 ---- .../__tests__/AppleAppIdentifierUtils-test.ts | 13 ------------- .../src/credentials/ios/api/GraphqlClient.ts | 2 +- .../project/ios/__tests__/bundleIdentifier-test.ts | 13 +++++++++++++ .../eas-cli/src/project/ios/bundleIdentifier.ts | 5 +++++ 5 files changed, 19 insertions(+), 18 deletions(-) delete mode 100644 packages/eas-cli/src/credentials/ios/actions/AppleAppIdentifierUtils.ts delete mode 100644 packages/eas-cli/src/credentials/ios/actions/__tests__/AppleAppIdentifierUtils-test.ts diff --git a/packages/eas-cli/src/credentials/ios/actions/AppleAppIdentifierUtils.ts b/packages/eas-cli/src/credentials/ios/actions/AppleAppIdentifierUtils.ts deleted file mode 100644 index dcde9d5653..0000000000 --- a/packages/eas-cli/src/credentials/ios/actions/AppleAppIdentifierUtils.ts +++ /dev/null @@ -1,4 +0,0 @@ -export function isWildcardBundleIdentifier(bundleIdentifier: string): boolean { - const wildcardRegex = /^[A-Za-z0-9.-]+\*$/; - return wildcardRegex.test(bundleIdentifier); -} diff --git a/packages/eas-cli/src/credentials/ios/actions/__tests__/AppleAppIdentifierUtils-test.ts b/packages/eas-cli/src/credentials/ios/actions/__tests__/AppleAppIdentifierUtils-test.ts deleted file mode 100644 index 44ef1e8779..0000000000 --- a/packages/eas-cli/src/credentials/ios/actions/__tests__/AppleAppIdentifierUtils-test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { isWildcardBundleIdentifier } from '../AppleAppIdentifierUtils'; - -describe(isWildcardBundleIdentifier, () => { - it('classifies wildcard bundle identifiers correctly', async () => { - expect(isWildcardBundleIdentifier('doge.doge.*')).toBe(true); - expect(isWildcardBundleIdentifier('doge*')).toBe(true); - - expect(isWildcardBundleIdentifier('*')).toBe(false); - expect(isWildcardBundleIdentifier('*.doge')).toBe(false); - expect(isWildcardBundleIdentifier('doge')).toBe(false); - expect(isWildcardBundleIdentifier('doge.doge.doge')).toBe(false); - }); -}); diff --git a/packages/eas-cli/src/credentials/ios/api/GraphqlClient.ts b/packages/eas-cli/src/credentials/ios/api/GraphqlClient.ts index c4f24595e0..08d1704950 100644 --- a/packages/eas-cli/src/credentials/ios/api/GraphqlClient.ts +++ b/packages/eas-cli/src/credentials/ios/api/GraphqlClient.ts @@ -11,8 +11,8 @@ import { IosAppBuildCredentialsFragment, IosDistributionType, } from '../../../graphql/generated'; +import { isWildcardBundleIdentifier } from '../../../project/ios/bundleIdentifier'; import { Account } from '../../../user/Account'; -import { isWildcardBundleIdentifier } from '../actions/AppleAppIdentifierUtils'; import { DistributionCertificate, PushKey } from '../appstore/Credentials.types'; import { AppleTeamMissingError } from '../errors'; import { AppleAppIdentifierMutation } from './graphql/mutations/AppleAppIdentifierMutation'; diff --git a/packages/eas-cli/src/project/ios/__tests__/bundleIdentifier-test.ts b/packages/eas-cli/src/project/ios/__tests__/bundleIdentifier-test.ts index e4cda44bfb..13082af825 100644 --- a/packages/eas-cli/src/project/ios/__tests__/bundleIdentifier-test.ts +++ b/packages/eas-cli/src/project/ios/__tests__/bundleIdentifier-test.ts @@ -8,6 +8,7 @@ import { promptAsync } from '../../../prompts'; import { ensureBundleIdentifierIsDefinedForManagedProjectAsync, getBundleIdentifier, + isWildcardBundleIdentifier, } from '../bundleIdentifier'; jest.mock('fs'); @@ -141,3 +142,15 @@ describe(ensureBundleIdentifierIsDefinedForManagedProjectAsync, () => { }); }); }); + +describe(isWildcardBundleIdentifier, () => { + it('classifies wildcard bundle identifiers correctly', async () => { + expect(isWildcardBundleIdentifier('doge.doge.*')).toBe(true); + expect(isWildcardBundleIdentifier('doge*')).toBe(true); + + expect(isWildcardBundleIdentifier('*')).toBe(false); + expect(isWildcardBundleIdentifier('*.doge')).toBe(false); + expect(isWildcardBundleIdentifier('doge')).toBe(false); + expect(isWildcardBundleIdentifier('doge.doge.doge')).toBe(false); + }); +}); diff --git a/packages/eas-cli/src/project/ios/bundleIdentifier.ts b/packages/eas-cli/src/project/ios/bundleIdentifier.ts index 3852302217..c1096ffc0f 100644 --- a/packages/eas-cli/src/project/ios/bundleIdentifier.ts +++ b/packages/eas-cli/src/project/ios/bundleIdentifier.ts @@ -130,3 +130,8 @@ function _warnIfBundleIdentifierDefinedInAppConfigForGenericProject( export const warnIfBundleIdentifierDefinedInAppConfigForGenericProject = once( _warnIfBundleIdentifierDefinedInAppConfigForGenericProject ); + +export function isWildcardBundleIdentifier(bundleIdentifier: string): boolean { + const wildcardRegex = /^[A-Za-z0-9.-]+\*$/; + return wildcardRegex.test(bundleIdentifier); +}