UNPKG

11.6 kBSource Map (JSON)View Raw
1{"version":3,"file":"Scheme.js","sourceRoot":"","sources":["../../src/android/Scheme.ts"],"names":[],"mappings":"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","sourcesContent":["import { Parser } from 'xml2js';\nimport { ExpoConfig } from '../Config.types';\nimport { Document } from './Manifest';\n\nexport type IntentFilterProps = {\n actions: string[];\n categories: string[];\n schemes: string[];\n};\n\nexport function getScheme(config: ExpoConfig) {\n return typeof config.scheme === 'string' ? config.scheme : null;\n}\n\nexport async function setScheme(config: ExpoConfig, manifestDocument: Document) {\n let scheme = getScheme(config);\n if (!scheme) {\n return manifestDocument;\n }\n\n let mainActivity = manifestDocument.manifest.application[0].activity.filter(\n (e: any) => e['$']['android:name'] === '.MainActivity'\n );\n\n const schemeTag = `<data android:scheme=\"${scheme}\"/>`;\n const intentFiltersXML = `\n <intent-filter>\n <action android:name=\"android.intent.action.VIEW\"/>\n <category android:name=\"android.intent.category.DEFAULT\"/>\n <category android:name=\"android.intent.category.BROWSABLE\"/>\n ${schemeTag}\n </intent-filter>`;\n const parser = new Parser();\n const intentFiltersJSON = await parser.parseStringPromise(intentFiltersXML);\n\n if ('intent-filter' in mainActivity[0]) {\n mainActivity[0]['intent-filter'] = mainActivity[0]['intent-filter'].concat(\n intentFiltersJSON['intent-filter']\n );\n } else {\n mainActivity[0]['intent-filter'] = intentFiltersJSON['intent-filter'];\n }\n\n return manifestDocument;\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 =\n 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(manifestDocument: Document): any[] {\n if (!Array.isArray(manifestDocument.manifest.application)) return [];\n\n let outputSchemes: any[] = [];\n for (let application of manifestDocument.manifest.application) {\n const { activity } = application;\n let activities = Array.isArray(activity) ? activity : [activity];\n const singleTaskActivities = activities.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(manifestDocument: Document): string[] {\n let outputSchemes: IntentFilterProps[] = [];\n\n const singleTaskIntentFilters = getSingleTaskIntentFilters(manifestDocument);\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<string[]>((prev, { schemes }) => [...prev, ...schemes], []);\n}\n\nexport function ensureManifestHasValidIntentFilter(manifestDocument: Document): boolean {\n if (!Array.isArray(manifestDocument.manifest.application)) return false;\n\n for (let application of manifestDocument.manifest.application) {\n for (let activity of application.activity) {\n if (activity?.['$']?.['android:launchMode'] === 'singleTask') {\n for (let 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 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, manifestDocument: Document): boolean {\n const schemes = getSchemesFromManifest(manifestDocument);\n return schemes.includes(scheme);\n}\n\nexport function appendScheme(scheme: string, manifestDocument: Document): Document {\n if (!Array.isArray(manifestDocument.manifest.application)) return manifestDocument;\n\n for (let application of manifestDocument.manifest.application) {\n for (let activity of application.activity) {\n if (activity?.['$']?.['android:launchMode'] === 'singleTask') {\n for (let 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 manifestDocument;\n}\n\nexport function removeScheme(scheme: string, manifestDocument: Document): Document {\n if (!Array.isArray(manifestDocument.manifest.application)) return manifestDocument;\n\n for (let application of manifestDocument.manifest.application) {\n for (let activity of application.activity) {\n if (activity?.['$']?.['android:launchMode'] === 'singleTask') {\n for (let intentFilter of activity['intent-filter']) {\n // Parse valid intent filters...\n const properties = propertiesFromIntentFilter(intentFilter);\n if (isValidRedirectIntentFilter(properties)) {\n for (let dataKey in intentFilter?.data) {\n let 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 manifestDocument;\n}\n"]}
\No newline at end of file