1{"version":3,"file":"Xcodeproj.js","names":["getProjectName","projectRoot","sourceRoot","Paths","getSourceRoot","path","basename","resolvePathOrProject","projectRootOrProject","getPbxproj","sanitizedName","name","sanitizedNameForProjects","slugify","replace","normalize","getHackyProjectName","config","projectName","assert","createProjectFileForGroup","filepath","group","file","pbxFile","conflictingFile","children","find","child","comment","addResourceFileToGroup","groupName","isBuildFile","project","verbose","targetUuid","addFileToGroupAndLink","addFileToProject","addToPbxFileReferenceSection","addToPbxBuildFileSection","addToPbxResourcesBuildPhase","addBuildSourceFileToGroup","addToPbxSourcesBuildPhase","pbxGroupByPathOrAssert","addWarningIOS","target","applicationNativeTarget","getTarget","uuid","generateUuid","fileRef","push","value","getApplicationNativeTarget","String","addFramework","framework","splitPath","split","findGroup","undefined","findGroupInsideGroup","foundGroup","getPBXGroupByKey","firstProject","getFirstProject","mainGroup","components","nextGroup","Error","ensureGroupRecursively","hasChild","topMostGroup","pathComponent","pbxCreateGroup","pbxGroupByName","projectPath","getPBXProjectPath","xcode","parseSync","getProductName","productName","targetName","getFirstTarget","firstTarget","getProjectSection","pbxProjectSection","getXCConfigurationListEntries","lists","pbxXCConfigurationList","Object","entries","filter","isNotComment","getBuildConfigurationsForListId","configurationListId","configurationListEntries","configurationList","key","buildConfigurations","map","i","pbxXCBuildConfigurationSection","isBuildConfig","includes","getBuildConfigurationForListIdAndName","buildConfiguration","xcBuildConfigurationEntry","trimQuotes","sectionItem","isa","isNotTestHost","buildSettings","TEST_HOST","endsWith","unquote","match"],"sources":["../../../src/ios/utils/Xcodeproj.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport assert from 'assert';\nimport path from 'path';\nimport slugify from 'slugify';\nimport xcode, {\n PBXFile,\n PBXGroup,\n PBXNativeTarget,\n PBXProject,\n UUID,\n XCBuildConfiguration,\n XCConfigurationList,\n XcodeProject,\n} from 'xcode';\nimport pbxFile from 'xcode/lib/pbxFile';\n\nimport { addWarningIOS } from '../../utils/warnings';\nimport * as Paths from '../Paths';\nimport { trimQuotes } from './string';\n\nexport type ProjectSectionEntry = [string, PBXProject];\n\nexport type NativeTargetSection = Record<string, PBXNativeTarget>;\n\nexport type NativeTargetSectionEntry = [string, PBXNativeTarget];\n\nexport type ConfigurationLists = Record<string, XCConfigurationList>;\n\nexport type ConfigurationListEntry = [string, XCConfigurationList];\n\nexport type ConfigurationSectionEntry = [string, XCBuildConfiguration];\n\nexport function getProjectName(projectRoot: string) {\n const sourceRoot = Paths.getSourceRoot(projectRoot);\n return path.basename(sourceRoot);\n}\n\nexport function resolvePathOrProject(\n projectRootOrProject: string | XcodeProject\n): XcodeProject | null {\n if (typeof projectRootOrProject === 'string') {\n try {\n return getPbxproj(projectRootOrProject);\n } catch {\n return null;\n }\n }\n return projectRootOrProject;\n}\n\n// TODO: come up with a better solution for using app.json expo.name in various places\nexport function sanitizedName(name: string) {\n // Default to the name `app` when every safe character has been sanitized\n return sanitizedNameForProjects(name) || sanitizedNameForProjects(slugify(name)) || 'app';\n}\n\nfunction sanitizedNameForProjects(name: string) {\n return name\n .replace(/[\\W_]+/g, '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '');\n}\n\n// TODO: it's silly and kind of fragile that we look at app config to determine\n// the ios project paths. Overall this function needs to be revamped, just a\n// placeholder for now! Make this more robust when we support applying config\n// at any time (currently it's only applied on eject).\nexport function getHackyProjectName(projectRoot: string, config: ExpoConfig): string {\n // Attempt to get the current ios folder name (apply).\n try {\n return getProjectName(projectRoot);\n } catch {\n // If no iOS project exists then create a new one (eject).\n const projectName = config.name;\n assert(projectName, 'Your project needs a name in app.json/app.config.js.');\n return sanitizedName(projectName);\n }\n}\n\nfunction createProjectFileForGroup({ filepath, group }: { filepath: string; group: PBXGroup }) {\n const file = new pbxFile(filepath);\n\n const conflictingFile = group.children.find((child) => child.comment === file.basename);\n if (conflictingFile) {\n // This can happen when a file like the GoogleService-Info.plist needs to be added and the eject command is run twice.\n // Not much we can do here since it might be a conflicting file.\n return null;\n }\n return file;\n}\n\n/**\n * Add a resource file (ex: `SplashScreen.storyboard`, `Images.xcassets`) to an Xcode project.\n * This is akin to creating a new code file in Xcode with `⌘+n`.\n */\nexport function addResourceFileToGroup({\n filepath,\n groupName,\n // Should add to `PBXBuildFile Section`\n isBuildFile,\n project,\n verbose,\n targetUuid,\n}: {\n filepath: string;\n groupName: string;\n isBuildFile?: boolean;\n project: XcodeProject;\n verbose?: boolean;\n targetUuid?: string;\n}): XcodeProject {\n return addFileToGroupAndLink({\n filepath,\n groupName,\n project,\n verbose,\n targetUuid,\n addFileToProject({ project, file }) {\n project.addToPbxFileReferenceSection(file);\n if (isBuildFile) {\n project.addToPbxBuildFileSection(file);\n }\n project.addToPbxResourcesBuildPhase(file);\n },\n });\n}\n\n/**\n * Add a build source file (ex: `AppDelegate.m`, `ViewController.swift`) to an Xcode project.\n * This is akin to creating a new code file in Xcode with `⌘+n`.\n */\nexport function addBuildSourceFileToGroup({\n filepath,\n groupName,\n project,\n verbose,\n targetUuid,\n}: {\n filepath: string;\n groupName: string;\n project: XcodeProject;\n verbose?: boolean;\n targetUuid?: string;\n}): XcodeProject {\n return addFileToGroupAndLink({\n filepath,\n groupName,\n project,\n verbose,\n targetUuid,\n addFileToProject({ project, file }) {\n project.addToPbxFileReferenceSection(file);\n project.addToPbxBuildFileSection(file);\n project.addToPbxSourcesBuildPhase(file);\n },\n });\n}\n\n// TODO(brentvatne): I couldn't figure out how to do this with an existing\n// higher level function exposed by the xcode library, but we should find out how to do\n// that and replace this with it\nexport function addFileToGroupAndLink({\n filepath,\n groupName,\n project,\n verbose,\n addFileToProject,\n targetUuid,\n}: {\n filepath: string;\n groupName: string;\n project: XcodeProject;\n verbose?: boolean;\n targetUuid?: string;\n addFileToProject: (props: { file: PBXFile; project: XcodeProject }) => void;\n}): XcodeProject {\n const group = pbxGroupByPathOrAssert(project, groupName);\n\n const file = createProjectFileForGroup({ filepath, group });\n\n if (!file) {\n if (verbose) {\n // This can happen when a file like the GoogleService-Info.plist needs to be added and the eject command is run twice.\n // Not much we can do here since it might be a conflicting file.\n addWarningIOS(\n 'ios-xcode-project',\n `Skipped adding duplicate file \"${filepath}\" to PBXGroup named \"${groupName}\"`\n );\n }\n return project;\n }\n\n if (targetUuid != null) {\n file.target = targetUuid;\n } else {\n const applicationNativeTarget = project.getTarget('com.apple.product-type.application');\n file.target = applicationNativeTarget?.uuid;\n }\n\n file.uuid = project.generateUuid();\n file.fileRef = project.generateUuid();\n\n addFileToProject({ project, file });\n\n group.children.push({\n value: file.fileRef,\n comment: file.basename,\n });\n return project;\n}\n\nexport function getApplicationNativeTarget({\n project,\n projectName,\n}: {\n project: XcodeProject;\n projectName: string;\n}) {\n const applicationNativeTarget = project.getTarget('com.apple.product-type.application');\n assert(\n applicationNativeTarget,\n `Couldn't locate application PBXNativeTarget in '.xcodeproj' file.`\n );\n assert(\n String(applicationNativeTarget.target.name) === projectName,\n `Application native target name mismatch. Expected ${projectName}, but found ${applicationNativeTarget.target.name}.`\n );\n return applicationNativeTarget;\n}\n\n/**\n * Add a framework to the default app native target.\n *\n * @param projectName Name of the PBX project.\n * @param framework String ending in `.framework`, i.e. `StoreKit.framework`\n */\nexport function addFramework({\n project,\n projectName,\n framework,\n}: {\n project: XcodeProject;\n projectName: string;\n framework: string;\n}) {\n const target = getApplicationNativeTarget({ project, projectName });\n return project.addFramework(framework, { target: target.uuid });\n}\n\nfunction splitPath(path: string): string[] {\n // TODO: Should we account for other platforms that may not use `/`\n return path.split('/');\n}\n\nconst findGroup = (\n group: PBXGroup | undefined,\n name: string\n):\n | {\n value: UUID;\n comment?: string;\n }\n | undefined => {\n if (!group) {\n return undefined;\n }\n\n return group.children.find((group) => group.comment === name);\n};\n\nfunction findGroupInsideGroup(\n project: XcodeProject,\n group: PBXGroup | undefined,\n name: string\n): null | PBXGroup {\n const foundGroup = findGroup(group, name);\n if (foundGroup) {\n return project.getPBXGroupByKey(foundGroup.value) ?? null;\n }\n return null;\n}\n\nfunction pbxGroupByPathOrAssert(project: XcodeProject, path: string): PBXGroup {\n const { firstProject } = project.getFirstProject();\n\n let group = project.getPBXGroupByKey(firstProject.mainGroup);\n\n const components = splitPath(path);\n for (const name of components) {\n const nextGroup = findGroupInsideGroup(project, group, name);\n if (nextGroup) {\n group = nextGroup;\n } else {\n break;\n }\n }\n\n if (!group) {\n throw Error(`Xcode PBXGroup with name \"${path}\" could not be found in the Xcode project.`);\n }\n\n return group;\n}\n\nexport function ensureGroupRecursively(project: XcodeProject, filepath: string): PBXGroup | null {\n const components = splitPath(filepath);\n const hasChild = (group: PBXGroup, name: string) =>\n group.children.find(({ comment }) => comment === name);\n const { firstProject } = project.getFirstProject();\n\n let topMostGroup = project.getPBXGroupByKey(firstProject.mainGroup);\n\n for (const pathComponent of components) {\n if (topMostGroup && !hasChild(topMostGroup, pathComponent)) {\n topMostGroup.children.push({\n comment: pathComponent,\n value: project.pbxCreateGroup(pathComponent, '\"\"'),\n });\n }\n topMostGroup = project.pbxGroupByName(pathComponent);\n }\n return topMostGroup ?? null;\n}\n\n/**\n * Get the pbxproj for the given path\n */\nexport function getPbxproj(projectRoot: string): XcodeProject {\n const projectPath = Paths.getPBXProjectPath(projectRoot);\n const project = xcode.project(projectPath);\n project.parseSync();\n return project;\n}\n\n/**\n * Get the productName for a project, if the name is using a variable `$(TARGET_NAME)`, then attempt to get the value of that variable.\n *\n * @param project\n */\nexport function getProductName(project: XcodeProject): string {\n let productName = '$(TARGET_NAME)';\n try {\n // If the product name is numeric, this will fail (it's a getter).\n // If the bundle identifier' final component is only numeric values, then the PRODUCT_NAME\n // will be a numeric value, this results in a bug where the product name isn't useful,\n // i.e. `com.bacon.001` -> `1` -- in this case, use the first target name.\n productName = project.productName;\n } catch {}\n\n if (productName === '$(TARGET_NAME)') {\n const targetName = project.getFirstTarget()?.firstTarget?.productName;\n productName = targetName ?? productName;\n }\n\n return productName;\n}\n\nexport function getProjectSection(project: XcodeProject) {\n return project.pbxProjectSection();\n}\n\nexport function getXCConfigurationListEntries(project: XcodeProject): ConfigurationListEntry[] {\n const lists = project.pbxXCConfigurationList();\n return Object.entries(lists).filter(isNotComment);\n}\n\nexport function getBuildConfigurationsForListId(\n project: XcodeProject,\n configurationListId: string\n): ConfigurationSectionEntry[] {\n const configurationListEntries = getXCConfigurationListEntries(project);\n const [, configurationList] = configurationListEntries.find(\n ([key]) => key === configurationListId\n ) as ConfigurationListEntry;\n\n const buildConfigurations = configurationList.buildConfigurations.map((i) => i.value);\n\n return Object.entries(project.pbxXCBuildConfigurationSection())\n .filter(isNotComment)\n .filter(isBuildConfig)\n .filter(([key]: ConfigurationSectionEntry) => buildConfigurations.includes(key));\n}\n\nexport function getBuildConfigurationForListIdAndName(\n project: XcodeProject,\n {\n configurationListId,\n buildConfiguration,\n }: { configurationListId: string; buildConfiguration: string }\n): ConfigurationSectionEntry {\n const xcBuildConfigurationEntry = getBuildConfigurationsForListId(\n project,\n configurationListId\n ).find((i) => trimQuotes(i[1].name) === buildConfiguration);\n if (!xcBuildConfigurationEntry) {\n throw new Error(\n `Build configuration '${buildConfiguration}' does not exist in list with id '${configurationListId}'`\n );\n }\n return xcBuildConfigurationEntry;\n}\n\nexport function isBuildConfig([, sectionItem]: ConfigurationSectionEntry): boolean {\n return sectionItem.isa === 'XCBuildConfiguration';\n}\n\nexport function isNotTestHost([, sectionItem]: ConfigurationSectionEntry): boolean {\n return !sectionItem.buildSettings.TEST_HOST;\n}\n\nexport function isNotComment([key]:\n | ConfigurationSectionEntry\n | ProjectSectionEntry\n | ConfigurationListEntry\n | NativeTargetSectionEntry): boolean {\n return !key.endsWith(`_comment`);\n}\n\n// Remove surrounding double quotes if they exist.\nexport function unquote(value: string): string {\n // projects with numeric names will fail due to a bug in the xcode package.\n if (typeof value === 'number') {\n value = String(value);\n }\n return value.match(/^\"(.*)\"$/)?.[1] ?? value;\n}\n"],"mappings":"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"}