1*082815dcSEvan Baconimport fs from 'fs';
2*082815dcSEvan Bacon
3*082815dcSEvan Baconimport { findFirstNativeTarget, findNativeTargetByName } from './Target';
4*082815dcSEvan Baconimport {
5*082815dcSEvan Bacon  ConfigurationSectionEntry,
6*082815dcSEvan Bacon  getBuildConfigurationsForListId,
7*082815dcSEvan Bacon  getPbxproj,
8*082815dcSEvan Bacon  getProjectSection,
9*082815dcSEvan Bacon  isNotComment,
10*082815dcSEvan Bacon  ProjectSectionEntry,
11*082815dcSEvan Bacon} from './utils/Xcodeproj';
12*082815dcSEvan Baconimport { trimQuotes } from './utils/string';
13*082815dcSEvan Bacon
14*082815dcSEvan Bacontype ProvisioningProfileSettings = {
15*082815dcSEvan Bacon  targetName?: string;
16*082815dcSEvan Bacon  appleTeamId: string;
17*082815dcSEvan Bacon  profileName: string;
18*082815dcSEvan Bacon  buildConfiguration?: string;
19*082815dcSEvan Bacon};
20*082815dcSEvan Bacon
21*082815dcSEvan Baconexport function setProvisioningProfileForPbxproj(
22*082815dcSEvan Bacon  projectRoot: string,
23*082815dcSEvan Bacon  {
24*082815dcSEvan Bacon    targetName,
25*082815dcSEvan Bacon    profileName,
26*082815dcSEvan Bacon    appleTeamId,
27*082815dcSEvan Bacon    buildConfiguration = 'Release',
28*082815dcSEvan Bacon  }: ProvisioningProfileSettings
29*082815dcSEvan Bacon): void {
30*082815dcSEvan Bacon  const project = getPbxproj(projectRoot);
31*082815dcSEvan Bacon
32*082815dcSEvan Bacon  const nativeTargetEntry = targetName
33*082815dcSEvan Bacon    ? findNativeTargetByName(project, targetName)
34*082815dcSEvan Bacon    : findFirstNativeTarget(project);
35*082815dcSEvan Bacon  const [nativeTargetId, nativeTarget] = nativeTargetEntry;
36*082815dcSEvan Bacon
37*082815dcSEvan Bacon  const quotedAppleTeamId = ensureQuotes(appleTeamId);
38*082815dcSEvan Bacon
39*082815dcSEvan Bacon  getBuildConfigurationsForListId(project, nativeTarget.buildConfigurationList)
40*082815dcSEvan Bacon    .filter(([, item]: ConfigurationSectionEntry) => trimQuotes(item.name) === buildConfiguration)
41*082815dcSEvan Bacon    .forEach(([, item]: ConfigurationSectionEntry) => {
42*082815dcSEvan Bacon      item.buildSettings.PROVISIONING_PROFILE_SPECIFIER = `"${profileName}"`;
43*082815dcSEvan Bacon      item.buildSettings.DEVELOPMENT_TEAM = quotedAppleTeamId;
44*082815dcSEvan Bacon      item.buildSettings.CODE_SIGN_IDENTITY = '"iPhone Distribution"';
45*082815dcSEvan Bacon      item.buildSettings.CODE_SIGN_STYLE = 'Manual';
46*082815dcSEvan Bacon    });
47*082815dcSEvan Bacon
48*082815dcSEvan Bacon  Object.entries(getProjectSection(project))
49*082815dcSEvan Bacon    .filter(isNotComment)
50*082815dcSEvan Bacon    .forEach(([, item]: ProjectSectionEntry) => {
51*082815dcSEvan Bacon      if (!item.attributes.TargetAttributes[nativeTargetId]) {
52*082815dcSEvan Bacon        item.attributes.TargetAttributes[nativeTargetId] = {};
53*082815dcSEvan Bacon      }
54*082815dcSEvan Bacon      item.attributes.TargetAttributes[nativeTargetId].DevelopmentTeam = quotedAppleTeamId;
55*082815dcSEvan Bacon      item.attributes.TargetAttributes[nativeTargetId].ProvisioningStyle = 'Manual';
56*082815dcSEvan Bacon    });
57*082815dcSEvan Bacon
58*082815dcSEvan Bacon  fs.writeFileSync(project.filepath, project.writeSync());
59*082815dcSEvan Bacon}
60*082815dcSEvan Bacon
61*082815dcSEvan Baconconst ensureQuotes = (value: string) => {
62*082815dcSEvan Bacon  if (!value.match(/^['"]/)) {
63*082815dcSEvan Bacon    return `"${value}"`;
64*082815dcSEvan Bacon  }
65*082815dcSEvan Bacon  return value;
66*082815dcSEvan Bacon};
67