1{"version":3,"file":"Scheme.js","names":["withScheme","createAndroidManifestPlugin","setScheme","getScheme","config","Array","isArray","scheme","validate","value","filter","androidManifest","schemes","android","package","push","length","ensureManifestHasValidIntentFilter","addWarningAndroid","currentSchemes","getSchemesFromManifest","uri","index","indexOf","splice","appendScheme","isValidRedirectIntentFilter","actions","categories","includes","propertiesFromIntentFilter","intentFilter","action","map","data","$","category","host","getSingleTaskIntentFilters","manifest","application","outputSchemes","activity","activities","singleTaskActivities","intentFilters","concat","requestedHost","singleTaskIntentFilters","properties","hasScheme","removeScheme","dataKey"],"sources":["../../src/android/Scheme.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { createAndroidManifestPlugin } from '../plugins/android-plugins';\nimport { addWarningAndroid } from '../utils/warnings';\nimport { AndroidManifest, ManifestActivity } from './Manifest';\n\nexport type IntentFilterProps = {\n  actions: string[];\n  categories: string[];\n  data: {\n    scheme: string;\n    host?: string;\n  }[];\n};\n\nexport const withScheme = createAndroidManifestPlugin(setScheme, 'withScheme');\n\nexport function getScheme(config: { scheme?: string | string[] }): string[] {\n  if (Array.isArray(config.scheme)) {\n    const validate = (value: any): value is string => typeof value === 'string';\n\n    return config.scheme.filter<string>(validate);\n  } else if (typeof config.scheme === 'string') {\n    return [config.scheme];\n  }\n  return [];\n}\n\n// This plugin used to remove the unused schemes but this is unpredictable because other plugins could add schemes.\n// The only way to reliably remove schemes from the project is to nuke the file and regenerate the code (`expo prebuild --clean`).\n// Regardless, having extra schemes isn't a fatal issue and therefore a tolerable compromise is to just add new schemes that aren't currently present.\nexport function setScheme(\n  config: Pick<ExpoConfig, 'scheme' | 'android'>,\n  androidManifest: AndroidManifest\n) {\n  const schemes = [\n    ...getScheme(config),\n    // @ts-ignore: TODO: android.scheme is an unreleased -- harder to add to turtle v1.\n    ...getScheme(config.android ?? {}),\n  ];\n  // Add the package name to the list of schemes for easier Google auth and parity with Turtle v1.\n  if (config.android?.package) {\n    schemes.push(config.android.package);\n  }\n  if (schemes.length === 0) {\n    return androidManifest;\n  }\n\n  if (!ensureManifestHasValidIntentFilter(androidManifest)) {\n    addWarningAndroid(\n      'scheme',\n      `Cannot add schemes because the provided manifest does not have a valid Activity with \\`android:launchMode=\"singleTask\"\\``,\n      'https://expo.fyi/setup-android-uri-scheme'\n    );\n    return androidManifest;\n  }\n\n  // Get the current schemes and remove them from the list of schemes to add.\n  const currentSchemes = getSchemesFromManifest(androidManifest);\n  for (const uri of currentSchemes) {\n    const index = schemes.indexOf(uri);\n    if (index > -1) schemes.splice(index, 1);\n  }\n\n  // Now add all of the remaining schemes.\n  for (const uri of schemes) {\n    androidManifest = appendScheme(uri, androidManifest);\n  }\n\n  return androidManifest;\n}\n\nfunction isValidRedirectIntentFilter({ actions, categories }: IntentFilterProps): boolean {\n  return (\n    actions.includes('android.intent.action.VIEW') &&\n    !categories.includes('android.intent.category.LAUNCHER')\n  );\n}\n\nfunction propertiesFromIntentFilter(intentFilter: any): IntentFilterProps {\n  const actions = intentFilter?.action?.map((data: any) => data?.$?.['android:name']) ?? [];\n  const categories = intentFilter?.category?.map((data: any) => data?.$?.['android:name']) ?? [];\n  const data =\n    intentFilter?.data\n      ?.filter((data: any) => data?.$?.['android:scheme'])\n      ?.map((data: any) => ({\n        scheme: data?.$?.['android:scheme'],\n        host: data?.$?.['android:host'],\n      })) ?? [];\n  return {\n    actions,\n    categories,\n    data,\n  };\n}\n\nfunction getSingleTaskIntentFilters(androidManifest: AndroidManifest): any[] {\n  if (!Array.isArray(androidManifest.manifest.application)) return [];\n\n  let outputSchemes: any[] = [];\n  for (const application of androidManifest.manifest.application) {\n    const { activity } = application;\n    // @ts-ignore\n    const activities = Array.isArray(activity) ? activity : [activity];\n    const singleTaskActivities = (activities as ManifestActivity[]).filter(\n      (activity) => activity?.$?.['android:launchMode'] === 'singleTask'\n    );\n    for (const activity of singleTaskActivities) {\n      const intentFilters = activity['intent-filter'];\n      outputSchemes = outputSchemes.concat(intentFilters);\n    }\n  }\n  return outputSchemes;\n}\n\nexport function getSchemesFromManifest(\n  androidManifest: AndroidManifest,\n  requestedHost: string | null = null\n): string[] {\n  const outputSchemes: string[] = [];\n\n  const singleTaskIntentFilters = getSingleTaskIntentFilters(androidManifest);\n  for (const intentFilter of singleTaskIntentFilters) {\n    const properties = propertiesFromIntentFilter(intentFilter);\n    if (isValidRedirectIntentFilter(properties) && properties.data) {\n      for (const { scheme, host } of properties.data) {\n        if (requestedHost === null || !host || host === requestedHost) {\n          outputSchemes.push(scheme);\n        }\n      }\n    }\n  }\n\n  return outputSchemes;\n}\n\nexport function ensureManifestHasValidIntentFilter(androidManifest: AndroidManifest): boolean {\n  if (!Array.isArray(androidManifest.manifest.application)) {\n    return false;\n  }\n\n  for (const application of androidManifest.manifest.application) {\n    for (const activity of application.activity || []) {\n      if (activity?.$?.['android:launchMode'] === 'singleTask') {\n        for (const intentFilter of activity['intent-filter'] || []) {\n          // Parse valid intent filters...\n          const properties = propertiesFromIntentFilter(intentFilter);\n          if (isValidRedirectIntentFilter(properties)) {\n            return true;\n          }\n        }\n        if (!activity['intent-filter']) {\n          activity['intent-filter'] = [];\n        }\n\n        activity['intent-filter'].push({\n          action: [{ $: { 'android:name': 'android.intent.action.VIEW' } }],\n          category: [\n            { $: { 'android:name': 'android.intent.category.DEFAULT' } },\n            { $: { 'android:name': 'android.intent.category.BROWSABLE' } },\n          ],\n        });\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nexport function hasScheme(scheme: string, androidManifest: AndroidManifest): boolean {\n  const schemes = getSchemesFromManifest(androidManifest);\n  return schemes.includes(scheme);\n}\n\nexport function appendScheme(scheme: string, androidManifest: AndroidManifest): AndroidManifest {\n  if (!Array.isArray(androidManifest.manifest.application)) {\n    return androidManifest;\n  }\n\n  for (const application of androidManifest.manifest.application) {\n    for (const activity of application.activity || []) {\n      if (activity?.$?.['android:launchMode'] === 'singleTask') {\n        for (const intentFilter of activity['intent-filter'] || []) {\n          const properties = propertiesFromIntentFilter(intentFilter);\n          if (isValidRedirectIntentFilter(properties)) {\n            if (!intentFilter.data) intentFilter.data = [];\n            intentFilter.data.push({\n              $: { 'android:scheme': scheme },\n            });\n          }\n        }\n        break;\n      }\n    }\n  }\n  return androidManifest;\n}\n\nexport function removeScheme(scheme: string, androidManifest: AndroidManifest): AndroidManifest {\n  if (!Array.isArray(androidManifest.manifest.application)) {\n    return androidManifest;\n  }\n\n  for (const application of androidManifest.manifest.application) {\n    for (const activity of application.activity || []) {\n      if (activity?.$?.['android:launchMode'] === 'singleTask') {\n        for (const intentFilter of activity['intent-filter'] || []) {\n          // Parse valid intent filters...\n          const properties = propertiesFromIntentFilter(intentFilter);\n          if (isValidRedirectIntentFilter(properties)) {\n            for (const dataKey in intentFilter?.data || []) {\n              const data = intentFilter.data?.[dataKey];\n              if (data?.$?.['android:scheme'] === scheme) {\n                delete intentFilter.data?.[dataKey];\n              }\n            }\n          }\n        }\n        break;\n      }\n    }\n  }\n\n  return androidManifest;\n}\n"],"mappings":"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"}