{"version":3,"file":"Scheme.js","sourceRoot":"","sources":["../../src/android/Scheme.ts"],"names":[],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { createAndroidManifestPlugin } from '../plugins/android-plugins';\nimport * as WarningAggregator from '../utils/warnings';\nimport { AndroidManifest, ManifestActivity } from './Manifest';\n\nexport type IntentFilterProps = {\n actions: string[];\n categories: string[];\n schemes: string[];\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(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,\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 WarningAggregator.addWarningAndroid(\n 'scheme',\n `Cannot add schemes because the provided manifest does not have a valid Activity with \\`android:launchMode=\"singleTask\"\\`.\\nThis guide can help you get setup properly 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, schemes }: 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 schemes = intentFilter?.data?.map((data: any) => data?.$?.['android:scheme']) ?? [];\n return {\n schemes,\n actions,\n categories,\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(androidManifest: AndroidManifest): string[] {\n const outputSchemes: IntentFilterProps[] = [];\n\n const singleTaskIntentFilters = getSingleTaskIntentFilters(androidManifest);\n for (const intentFilter of singleTaskIntentFilters) {\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n outputSchemes.push(properties);\n }\n }\n\n return outputSchemes.reduce((prev, { schemes }) => [...prev, ...schemes], []);\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"]}