1c4ef02aeSEvan Baconimport chalk from 'chalk'; 2c4ef02aeSEvan Bacon 3c4ef02aeSEvan Baconimport * as Security from './Security'; 4c4ef02aeSEvan Baconimport { resolveCertificateSigningIdentityAsync } from './resolveCertificateSigningIdentity'; 5c4ef02aeSEvan Baconimport { getCodeSigningInfoForPbxproj, setAutoCodeSigningInfoForPbxproj } from './xcodeCodeSigning'; 6*8a424bebSJames Ideimport * as Log from '../../../log'; 7c4ef02aeSEvan Bacon 8c4ef02aeSEvan Baconexport async function ensureDeviceIsCodeSignedForDeploymentAsync( 9c4ef02aeSEvan Bacon projectRoot: string 10c4ef02aeSEvan Bacon): Promise<string | null> { 11c4ef02aeSEvan Bacon if (isCodeSigningConfigured(projectRoot)) { 12c4ef02aeSEvan Bacon return null; 13c4ef02aeSEvan Bacon } 14c4ef02aeSEvan Bacon return configureCodeSigningAsync(projectRoot); 15c4ef02aeSEvan Bacon} 16c4ef02aeSEvan Bacon 17c4ef02aeSEvan Baconfunction isCodeSigningConfigured(projectRoot: string): boolean { 18c4ef02aeSEvan Bacon // Check if the app already has a development team defined. 19c4ef02aeSEvan Bacon const signingInfo = getCodeSigningInfoForPbxproj(projectRoot); 20c4ef02aeSEvan Bacon 21c4ef02aeSEvan Bacon const allTargetsHaveTeams = Object.values(signingInfo).reduce((prev, curr) => { 22c4ef02aeSEvan Bacon return prev && !!curr.developmentTeams.length; 23c4ef02aeSEvan Bacon }, true); 24c4ef02aeSEvan Bacon 25c4ef02aeSEvan Bacon if (allTargetsHaveTeams) { 26c4ef02aeSEvan Bacon const teamList = Object.values(signingInfo).reduce<string[]>((prev, curr) => { 27c4ef02aeSEvan Bacon return prev.concat([curr.developmentTeams[0]]); 28c4ef02aeSEvan Bacon }, []); 29c4ef02aeSEvan Bacon Log.log(chalk.dim`\u203A Auto signing app using team(s): ${teamList.join(', ')}`); 30c4ef02aeSEvan Bacon return true; 31c4ef02aeSEvan Bacon } 32c4ef02aeSEvan Bacon 33c4ef02aeSEvan Bacon const allTargetsHaveProfiles = Object.values(signingInfo).reduce((prev, curr) => { 34c4ef02aeSEvan Bacon return prev && !!curr.provisioningProfiles.length; 35c4ef02aeSEvan Bacon }, true); 36c4ef02aeSEvan Bacon 37c4ef02aeSEvan Bacon if (allTargetsHaveProfiles) { 38c4ef02aeSEvan Bacon // this indicates that the user has manual code signing setup (possibly for production). 39c4ef02aeSEvan Bacon return true; 40c4ef02aeSEvan Bacon } 41c4ef02aeSEvan Bacon return false; 42c4ef02aeSEvan Bacon} 43c4ef02aeSEvan Bacon 44c4ef02aeSEvan Baconasync function configureCodeSigningAsync(projectRoot: string) { 45c4ef02aeSEvan Bacon const ids = await Security.findIdentitiesAsync(); 46c4ef02aeSEvan Bacon 47c4ef02aeSEvan Bacon const id = await resolveCertificateSigningIdentityAsync(ids); 48c4ef02aeSEvan Bacon 49c4ef02aeSEvan Bacon Log.log(`\u203A Signing and building iOS app with: ${id.codeSigningInfo}`); 50c4ef02aeSEvan Bacon 51c4ef02aeSEvan Bacon setAutoCodeSigningInfoForPbxproj(projectRoot, { 52c4ef02aeSEvan Bacon appleTeamId: id.appleTeamId!, 53c4ef02aeSEvan Bacon }); 54c4ef02aeSEvan Bacon return id.appleTeamId!; 55c4ef02aeSEvan Bacon} 56