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