1{"version":3,"file":"Maps.js","names":["debug","require","MATCH_INIT","withGoogleMapsKey","createInfoPlistPlugin","setGoogleMapsApiKey","withMaps","config","apiKey","getGoogleMapsApiKey","withMapsCocoaPods","useGoogleMaps","withGoogleMapsAppDelegate","ios","googleMapsApiKey","GMSApiKey","infoPlist","addGoogleMapsAppDelegateImport","src","newSrc","push","mergeContents","tag","join","anchor","offset","comment","removeGoogleMapsAppDelegateImport","removeContents","addGoogleMapsAppDelegateInit","removeGoogleMapsAppDelegateInit","addMapsCocoaPods","removeMapsCocoaPods","isReactNativeMapsInstalled","projectRoot","resolved","resolveFrom","silent","path","dirname","isReactNativeMapsAutolinked","withDangerousMod","filePath","modRequest","platformProjectRoot","contents","fs","promises","readFile","results","googleMapsPath","isLinked","error","code","Error","didMerge","didClear","writeFile","withAppDelegate","includes","modResults","language"],"sources":["../../src/ios/Maps.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport fs from 'fs';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { ConfigPlugin, InfoPlist } from '../Plugin.types';\nimport { createInfoPlistPlugin, withAppDelegate } from '../plugins/ios-plugins';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { mergeContents, MergeResults, removeContents } from '../utils/generateCode';\n\nconst debug = require('debug')('expo:config-plugins:ios:maps') as typeof console.log;\n\n// Match against `UMModuleRegistryAdapter` (unimodules), and React Native without unimodules (Expo Modules), and SDK +44 React AppDelegate subscriber.\nexport const MATCH_INIT =\n  /(?:(self\\.|_)(\\w+)\\s?=\\s?\\[\\[UMModuleRegistryAdapter alloc\\])|(?:RCTBridge\\s?\\*\\s?(\\w+)\\s?=\\s?\\[\\[RCTBridge alloc\\])|(\\[self\\.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions\\])/g;\n\nconst withGoogleMapsKey = createInfoPlistPlugin(setGoogleMapsApiKey, 'withGoogleMapsKey');\n\nexport const withMaps: ConfigPlugin = (config) => {\n  config = withGoogleMapsKey(config);\n\n  const apiKey = getGoogleMapsApiKey(config);\n  // Technically adds react-native-maps (Apple maps) and google maps.\n\n  debug('Google Maps API Key:', apiKey);\n  config = withMapsCocoaPods(config, { useGoogleMaps: !!apiKey });\n\n  // Adds/Removes AppDelegate setup for Google Maps API on iOS\n  config = withGoogleMapsAppDelegate(config, { apiKey });\n\n  return config;\n};\n\nexport function getGoogleMapsApiKey(config: Pick<ExpoConfig, 'ios'>) {\n  return config.ios?.config?.googleMapsApiKey ?? null;\n}\n\nexport function setGoogleMapsApiKey(\n  config: Pick<ExpoConfig, 'ios'>,\n  { GMSApiKey, ...infoPlist }: InfoPlist\n): InfoPlist {\n  const apiKey = getGoogleMapsApiKey(config);\n\n  if (apiKey === null) {\n    return infoPlist;\n  }\n\n  return {\n    ...infoPlist,\n    GMSApiKey: apiKey,\n  };\n}\n\nexport function addGoogleMapsAppDelegateImport(src: string): MergeResults {\n  const newSrc = [];\n  newSrc.push(\n    '#if __has_include(<GoogleMaps/GoogleMaps.h>)',\n    '#import <GoogleMaps/GoogleMaps.h>',\n    '#endif'\n  );\n\n  return mergeContents({\n    tag: 'react-native-maps-import',\n    src,\n    newSrc: newSrc.join('\\n'),\n    anchor: /#import \"AppDelegate\\.h\"/,\n    offset: 1,\n    comment: '//',\n  });\n}\n\nexport function removeGoogleMapsAppDelegateImport(src: string): MergeResults {\n  return removeContents({\n    tag: 'react-native-maps-import',\n    src,\n  });\n}\n\nexport function addGoogleMapsAppDelegateInit(src: string, apiKey: string): MergeResults {\n  const newSrc = [];\n  newSrc.push(\n    '#if __has_include(<GoogleMaps/GoogleMaps.h>)',\n    `  [GMSServices provideAPIKey:@\"${apiKey}\"];`,\n    '#endif'\n  );\n\n  return mergeContents({\n    tag: 'react-native-maps-init',\n    src,\n    newSrc: newSrc.join('\\n'),\n    anchor: MATCH_INIT,\n    offset: 0,\n    comment: '//',\n  });\n}\n\nexport function removeGoogleMapsAppDelegateInit(src: string): MergeResults {\n  return removeContents({\n    tag: 'react-native-maps-init',\n    src,\n  });\n}\n\n/**\n * @param src The contents of the Podfile.\n * @returns Podfile with Google Maps added.\n */\nexport function addMapsCocoaPods(src: string): MergeResults {\n  return mergeContents({\n    tag: 'react-native-maps',\n    src,\n    newSrc: `  pod 'react-native-google-maps', path: File.dirname(\\`node --print \"require.resolve('react-native-maps/package.json')\"\\`)`,\n    anchor: /use_native_modules/,\n    offset: 0,\n    comment: '#',\n  });\n}\n\nexport function removeMapsCocoaPods(src: string): MergeResults {\n  return removeContents({\n    tag: 'react-native-maps',\n    src,\n  });\n}\n\nfunction isReactNativeMapsInstalled(projectRoot: string): string | null {\n  const resolved = resolveFrom.silent(projectRoot, 'react-native-maps/package.json');\n  return resolved ? path.dirname(resolved) : null;\n}\n\nfunction isReactNativeMapsAutolinked(config: Pick<ExpoConfig, '_internal'>): boolean {\n  // Only add the native code changes if we know that the package is going to be linked natively.\n  // This is specifically for monorepo support where one app might have react-native-maps (adding it to the node_modules)\n  // but another app will not have it installed in the package.json, causing it to not be linked natively.\n  // This workaround only exists because react-native-maps doesn't have a config plugin vendored in the package.\n\n  // TODO: `react-native-maps` doesn't use Expo autolinking so we cannot safely disable the module.\n  return true;\n\n  // return (\n  //   !config._internal?.autolinkedModules ||\n  //   config._internal.autolinkedModules.includes('react-native-maps')\n  // );\n}\n\nconst withMapsCocoaPods: ConfigPlugin<{ useGoogleMaps: boolean }> = (config, { useGoogleMaps }) => {\n  return withDangerousMod(config, [\n    'ios',\n    async (config) => {\n      const filePath = path.join(config.modRequest.platformProjectRoot, 'Podfile');\n      const contents = await fs.promises.readFile(filePath, 'utf-8');\n      let results: MergeResults;\n      // Only add the block if react-native-maps is installed in the project (best effort).\n      // Generally prebuild runs after a yarn install so this should always work as expected.\n      const googleMapsPath = isReactNativeMapsInstalled(config.modRequest.projectRoot);\n      const isLinked = isReactNativeMapsAutolinked(config);\n      debug('Is Expo Autolinked:', isLinked);\n      debug('react-native-maps path:', googleMapsPath);\n      if (isLinked && googleMapsPath && useGoogleMaps) {\n        try {\n          results = addMapsCocoaPods(contents);\n        } catch (error: any) {\n          if (error.code === 'ERR_NO_MATCH') {\n            throw new Error(\n              `Cannot add react-native-maps to the project's ios/Podfile because it's malformed. Please report this with a copy of your project Podfile.`\n            );\n          }\n          throw error;\n        }\n      } else {\n        // If the package is no longer installed, then remove the block.\n        results = removeMapsCocoaPods(contents);\n      }\n      if (results.didMerge || results.didClear) {\n        await fs.promises.writeFile(filePath, results.contents);\n      }\n      return config;\n    },\n  ]);\n};\n\nconst withGoogleMapsAppDelegate: ConfigPlugin<{ apiKey: string | null }> = (config, { apiKey }) => {\n  return withAppDelegate(config, (config) => {\n    if (['objc', 'objcpp'].includes(config.modResults.language)) {\n      if (\n        apiKey &&\n        isReactNativeMapsAutolinked(config) &&\n        isReactNativeMapsInstalled(config.modRequest.projectRoot)\n      ) {\n        try {\n          config.modResults.contents = addGoogleMapsAppDelegateImport(\n            config.modResults.contents\n          ).contents;\n          config.modResults.contents = addGoogleMapsAppDelegateInit(\n            config.modResults.contents,\n            apiKey\n          ).contents;\n        } catch (error: any) {\n          if (error.code === 'ERR_NO_MATCH') {\n            throw new Error(\n              `Cannot add Google Maps to the project's AppDelegate because it's malformed. Please report this with a copy of your project AppDelegate.`\n            );\n          }\n          throw error;\n        }\n      } else {\n        config.modResults.contents = removeGoogleMapsAppDelegateImport(\n          config.modResults.contents\n        ).contents;\n        config.modResults.contents = removeGoogleMapsAppDelegateInit(\n          config.modResults.contents\n        ).contents;\n      }\n    } else {\n      throw new Error(\n        `Cannot setup Google Maps because the project AppDelegate is not a supported language: ${config.modResults.language}`\n      );\n    }\n    return config;\n  });\n};\n"],"mappings":"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"}