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