1{"version":3,"file":"Swift.js","names":["templateBridgingHeader","withSwiftBridgingHeader","config","withXcodeProject","modResults","ensureSwiftBridgingHeaderSetup","project","projectRoot","modRequest","shouldCreateSwiftBridgingHeader","projectName","getProjectName","bridgingHeader","createBridgingHeaderFileName","createBridgingHeaderFile","linkBridgingHeaderFile","path","join","isObjc","getAppDelegate","language","getDesignatedSwiftBridgingHeaderFileReference","configurations","pbxXCBuildConfigurationSection","buildSettings","Object","values","PRODUCT_NAME","SWIFT_OBJC_BRIDGING_HEADER","bridgingHeaderProjectPath","getSourceRoot","fs","existsSync","writeFileSync","filePath","hasFile","addResourceFileToGroup","filepath","groupName","isBuildFile","verbose","withNoopSwiftFile","withBuildSourceFile","contents"],"sources":["../../src/ios/Swift.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { ConfigPlugin, XcodeProject } from '../Plugin.types';\nimport { withXcodeProject } from '../plugins/ios-plugins';\nimport { getAppDelegate, getSourceRoot } from './Paths';\nimport { withBuildSourceFile } from './XcodeProjectFile';\nimport { addResourceFileToGroup, getProjectName } from './utils/Xcodeproj';\n\nconst templateBridgingHeader = `//\n//  Use this file to import your target's public headers that you would like to expose to Swift.\n//\n`;\n\n/**\n * Ensure a Swift bridging header is created for the project.\n * This helps fix problems related to using modules that are written in Swift (lottie, FBSDK).\n *\n * 1. Ensures the file exists given the project path.\n * 2. Writes the file and links to Xcode as a resource file.\n * 3. Sets the build configuration `SWIFT_OBJC_BRIDGING_HEADER = [PROJECT_NAME]-Bridging-Header.h`\n */\nexport const withSwiftBridgingHeader: ConfigPlugin = (config) => {\n  return withXcodeProject(config, (config) => {\n    config.modResults = ensureSwiftBridgingHeaderSetup({\n      project: config.modResults,\n      projectRoot: config.modRequest.projectRoot,\n    });\n    return config;\n  });\n};\n\nexport function ensureSwiftBridgingHeaderSetup({\n  projectRoot,\n  project,\n}: {\n  projectRoot: string;\n  project: XcodeProject;\n}) {\n  // Only create a bridging header if using objective-c\n  if (shouldCreateSwiftBridgingHeader({ projectRoot, project })) {\n    const projectName = getProjectName(projectRoot);\n    const bridgingHeader = createBridgingHeaderFileName(projectName);\n    // Ensure a bridging header is created in the Xcode project.\n    project = createBridgingHeaderFile({\n      project,\n      projectName,\n      projectRoot,\n      bridgingHeader,\n    });\n    // Designate the newly created file as the Swift bridging header in the Xcode project.\n    project = linkBridgingHeaderFile({\n      project,\n      bridgingHeader: path.join(projectName, bridgingHeader),\n    });\n  }\n  return project;\n}\n\nfunction shouldCreateSwiftBridgingHeader({\n  projectRoot,\n  project,\n}: {\n  projectRoot: string;\n  project: XcodeProject;\n}): boolean {\n  // Only create a bridging header if the project is using in Objective C (AppDelegate is written in Objc).\n  const isObjc = getAppDelegate(projectRoot).language === 'objc';\n  return isObjc && !getDesignatedSwiftBridgingHeaderFileReference({ project });\n}\n\n/**\n * @returns String matching the default name used when Xcode automatically creates a bridging header file.\n */\nfunction createBridgingHeaderFileName(projectName: string): string {\n  return `${projectName}-Bridging-Header.h`;\n}\n\nexport function getDesignatedSwiftBridgingHeaderFileReference({\n  project,\n}: {\n  project: XcodeProject;\n}): string | null {\n  const configurations = project.pbxXCBuildConfigurationSection();\n  // @ts-ignore\n  for (const { buildSettings } of Object.values(configurations || {})) {\n    // Guessing that this is the best way to emulate Xcode.\n    // Using `project.addToBuildSettings` modifies too many targets.\n    if (typeof buildSettings?.PRODUCT_NAME !== 'undefined') {\n      if (\n        typeof buildSettings.SWIFT_OBJC_BRIDGING_HEADER === 'string' &&\n        buildSettings.SWIFT_OBJC_BRIDGING_HEADER\n      ) {\n        return buildSettings.SWIFT_OBJC_BRIDGING_HEADER;\n      }\n    }\n  }\n  return null;\n}\n\n/**\n *\n * @param bridgingHeader The bridging header filename ex: `ExpoAPIs-Bridging-Header.h`\n * @returns\n */\nexport function linkBridgingHeaderFile({\n  project,\n  bridgingHeader,\n}: {\n  project: XcodeProject;\n  bridgingHeader: string;\n}): XcodeProject {\n  const configurations = project.pbxXCBuildConfigurationSection();\n  // @ts-ignore\n  for (const { buildSettings } of Object.values(configurations || {})) {\n    // Guessing that this is the best way to emulate Xcode.\n    // Using `project.addToBuildSettings` modifies too many targets.\n    if (typeof buildSettings?.PRODUCT_NAME !== 'undefined') {\n      buildSettings.SWIFT_OBJC_BRIDGING_HEADER = bridgingHeader;\n    }\n  }\n\n  return project;\n}\n\nexport function createBridgingHeaderFile({\n  projectRoot,\n  projectName,\n  project,\n  bridgingHeader,\n}: {\n  project: XcodeProject;\n  projectName: string;\n  projectRoot: string;\n  bridgingHeader: string;\n}): XcodeProject {\n  const bridgingHeaderProjectPath = path.join(getSourceRoot(projectRoot), bridgingHeader);\n  if (!fs.existsSync(bridgingHeaderProjectPath)) {\n    // Create the file\n    fs.writeFileSync(bridgingHeaderProjectPath, templateBridgingHeader, 'utf8');\n  }\n\n  // This is non-standard, Xcode generates the bridging header in `/ios` which is kinda annoying.\n  // Instead, this'll generate the default header in the application code folder `/ios/myproject/`.\n  const filePath = `${projectName}/${bridgingHeader}`;\n  // Ensure the file is linked with Xcode resource files\n  if (!project.hasFile(filePath)) {\n    project = addResourceFileToGroup({\n      filepath: filePath,\n      groupName: projectName,\n      project,\n      // Not sure why, but this is how Xcode generates it.\n      isBuildFile: false,\n      verbose: false,\n    });\n  }\n  return project;\n}\n\nexport const withNoopSwiftFile: ConfigPlugin = (config) => {\n  return withBuildSourceFile(config, {\n    filePath: 'noop-file.swift',\n    contents: [\n      '//',\n      '// @generated',\n      '// A blank Swift file must be created for native modules with Swift files to work correctly.',\n      '//',\n      '',\n    ].join('\\n'),\n  });\n};\n"],"mappings":"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"}