This repository has been archived on 2022-03-12. You can view files and clone it, but cannot push or open issues or pull requests.
2021-04-02 02:24:13 +03:00

1 line
13 KiB
Plaintext

{"version":3,"file":"Manifest.js","sourceRoot":"","sources":["../../src/android/Manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs-extra';\nimport path from 'path';\n\nimport * as XML from '../utils/XML';\nimport { assert } from '../utils/errors';\n\nexport type StringBoolean = 'true' | 'false';\n\ntype ManifestMetaDataAttributes = AndroidManifestAttributes & {\n 'android:value'?: string;\n 'android:resource'?: string;\n};\n\ntype AndroidManifestAttributes = {\n 'android:name': string | 'android.intent.action.VIEW';\n};\n\ntype ManifestAction = {\n $: AndroidManifestAttributes;\n};\n\ntype ManifestCategory = {\n $: AndroidManifestAttributes;\n};\n\ntype ManifestData = {\n $: {\n [key: string]: string | undefined;\n 'android:host'?: string;\n 'android:pathPrefix'?: string;\n 'android:scheme'?: string;\n };\n};\n\ntype ManifestReciever = {\n $: AndroidManifestAttributes & {\n 'android:exported'?: StringBoolean;\n 'android:enabled'?: StringBoolean;\n };\n 'intent-filter'?: ManifestIntentFilter[];\n};\n\ntype ManifestIntentFilter = {\n action?: ManifestAction[];\n data?: ManifestData[];\n category?: ManifestCategory[];\n};\n\nexport type ManifestMetaData = {\n $: ManifestMetaDataAttributes;\n};\n\ntype ManifestServiceAttributes = AndroidManifestAttributes & {\n 'android:enabled'?: StringBoolean;\n 'android:exported'?: StringBoolean;\n 'android:permission'?: string;\n // ...\n};\n\ntype ManifestService = {\n $: ManifestServiceAttributes;\n 'intent-filter'?: ManifestIntentFilter[];\n};\n\ntype ManifestApplicationAttributes = {\n 'android:name': string | '.MainApplication';\n 'android:icon'?: string;\n 'android:label'?: string;\n 'android:allowBackup'?: StringBoolean;\n 'android:largeHeap'?: StringBoolean;\n 'android:requestLegacyExternalStorage'?: StringBoolean;\n 'android:usesCleartextTraffic'?: StringBoolean;\n [key: string]: string | undefined;\n};\n\nexport type ManifestActivity = {\n $: ManifestApplicationAttributes & {\n 'android:exported'?: StringBoolean;\n 'android:launchMode'?: string;\n 'android:theme'?: string;\n [key: string]: string | undefined;\n };\n 'intent-filter'?: ManifestIntentFilter[];\n // ...\n};\n\nexport type ManifestUsesLibrary = {\n $: AndroidManifestAttributes & {\n 'android:required'?: StringBoolean;\n };\n};\n\nexport type ManifestApplication = {\n $: ManifestApplicationAttributes;\n activity?: ManifestActivity[];\n service?: ManifestService[];\n receiver?: ManifestReciever[];\n 'meta-data'?: ManifestMetaData[];\n 'uses-library'?: ManifestUsesLibrary[];\n // ...\n};\n\ntype ManifestPermission = {\n $: AndroidManifestAttributes & {\n 'android:protectionLevel'?: string | 'signature';\n };\n};\n\nexport type ManifestUsesPermission = {\n $: AndroidManifestAttributes;\n};\n\ntype ManifestUsesFeature = {\n $: AndroidManifestAttributes & {\n 'android:glEsVersion'?: string;\n 'android:required': StringBoolean;\n };\n};\n\nexport type AndroidManifest = {\n manifest: {\n // Probably more, but this is currently all we'd need for most cases in Expo.\n $: { 'xmlns:android': string; package?: string; [key: string]: string | undefined };\n permission?: ManifestPermission[];\n 'uses-permission'?: ManifestUsesPermission[];\n 'uses-permission-sdk-23'?: ManifestUsesPermission[];\n 'uses-feature'?: ManifestUsesFeature[];\n application?: ManifestApplication[];\n };\n};\n\nexport async function writeAndroidManifestAsync(\n manifestPath: string,\n androidManifest: AndroidManifest\n): Promise<void> {\n const manifestXml = XML.format(androidManifest);\n await fs.ensureDir(path.dirname(manifestPath));\n await fs.writeFile(manifestPath, manifestXml);\n}\n\nexport async function readAndroidManifestAsync(manifestPath: string): Promise<AndroidManifest> {\n const xml = await XML.readXMLAsync({ path: manifestPath });\n if (!isManifest(xml)) {\n throw new Error('Invalid manifest found at: ' + manifestPath);\n }\n return xml;\n}\n\nfunction isManifest(xml: XML.XMLObject): xml is AndroidManifest {\n // TODO: Maybe more validation\n return !!xml.manifest;\n}\n\nexport function getMainApplication(androidManifest: AndroidManifest): ManifestApplication | null {\n return (\n androidManifest?.manifest?.application?.filter(\n e => e?.$?.['android:name'] === '.MainApplication'\n )[0] ?? null\n );\n}\n\nexport function getMainApplicationOrThrow(androidManifest: AndroidManifest): ManifestApplication {\n const mainApplication = getMainApplication(androidManifest);\n assert(mainApplication, 'AndroidManifest.xml is missing the required MainApplication element');\n return mainApplication;\n}\n\nexport function getMainActivityOrThrow(androidManifest: AndroidManifest): ManifestActivity {\n const mainActivity = getMainActivity(androidManifest);\n assert(mainActivity, 'AndroidManifest.xml is missing the required MainActivity element');\n return mainActivity;\n}\n\nexport function getMainActivity(androidManifest: AndroidManifest): ManifestActivity | null {\n const mainActivity = androidManifest?.manifest?.application?.[0]?.activity?.filter?.(\n (e: any) => e.$['android:name'] === '.MainActivity'\n );\n return mainActivity?.[0] ?? null;\n}\n\nexport function addMetaDataItemToMainApplication(\n mainApplication: ManifestApplication,\n itemName: string,\n itemValue: string,\n itemType: 'resource' | 'value' = 'value'\n): ManifestApplication {\n let existingMetaDataItem;\n const newItem = {\n $: prefixAndroidKeys({ name: itemName, [itemType]: itemValue }),\n } as ManifestMetaData;\n if (mainApplication['meta-data']) {\n existingMetaDataItem = mainApplication['meta-data'].filter(\n (e: any) => e.$['android:name'] === itemName\n );\n if (existingMetaDataItem.length) {\n existingMetaDataItem[0].$[\n `android:${itemType}` as keyof ManifestMetaDataAttributes\n ] = itemValue;\n } else {\n mainApplication['meta-data'].push(newItem);\n }\n } else {\n mainApplication['meta-data'] = [newItem];\n }\n return mainApplication;\n}\n\nexport function removeMetaDataItemFromMainApplication(mainApplication: any, itemName: string) {\n const index = findMetaDataItem(mainApplication, itemName);\n if (mainApplication?.['meta-data'] && index > -1) {\n mainApplication['meta-data'].splice(index, 1);\n }\n return mainApplication;\n}\n\nfunction findApplicationSubItem(\n mainApplication: ManifestApplication,\n category: keyof ManifestApplication,\n itemName: string\n): number {\n const parent = mainApplication[category];\n if (Array.isArray(parent)) {\n const index = parent.findIndex((e: any) => e.$['android:name'] === itemName);\n\n return index;\n }\n return -1;\n}\n\nexport function findMetaDataItem(mainApplication: any, itemName: string): number {\n return findApplicationSubItem(mainApplication, 'meta-data', itemName);\n}\n\nexport function findUsesLibraryItem(mainApplication: any, itemName: string): number {\n return findApplicationSubItem(mainApplication, 'uses-library', itemName);\n}\n\nexport function getMainApplicationMetaDataValue(\n androidManifest: AndroidManifest,\n name: string\n): string | null {\n const mainApplication = getMainApplication(androidManifest);\n\n if (mainApplication?.hasOwnProperty('meta-data')) {\n const item = mainApplication?.['meta-data']?.find((e: any) => e.$['android:name'] === name);\n return item?.$['android:value'] ?? null;\n }\n\n return null;\n}\n\nexport function addUsesLibraryItemToMainApplication(\n mainApplication: ManifestApplication,\n item: { name: string; required?: boolean }\n): ManifestApplication {\n let existingMetaDataItem;\n const newItem = {\n $: prefixAndroidKeys(item),\n } as ManifestUsesLibrary;\n\n if (mainApplication['uses-library']) {\n existingMetaDataItem = mainApplication['uses-library'].filter(\n e => e.$['android:name'] === item.name\n );\n if (existingMetaDataItem.length) {\n existingMetaDataItem[0].$ = newItem.$;\n } else {\n mainApplication['uses-library'].push(newItem);\n }\n } else {\n mainApplication['uses-library'] = [newItem];\n }\n return mainApplication;\n}\n\nexport function removeUsesLibraryItemFromMainApplication(\n mainApplication: ManifestApplication,\n itemName: string\n) {\n const index = findUsesLibraryItem(mainApplication, itemName);\n if (mainApplication?.['uses-library'] && index > -1) {\n mainApplication['uses-library'].splice(index, 1);\n }\n return mainApplication;\n}\n\nexport function prefixAndroidKeys<T extends Record<string, any> = Record<string, string>>(\n head: T\n): Record<string, any> {\n // prefix all keys with `android:`\n return Object.entries(head).reduce(\n (prev, [key, curr]) => ({ ...prev, [`android:${key}`]: curr }),\n {} as T\n );\n}\n"]}