@expo/config-plugins 4.1.4 → 4.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -52,6 +52,7 @@ declare type ManifestService = {
52
52
  declare type ManifestApplicationAttributes = {
53
53
  'android:name': string | '.MainApplication';
54
54
  'android:icon'?: string;
55
+ 'android:roundIcon'?: string;
55
56
  'android:label'?: string;
56
57
  'android:allowBackup'?: StringBoolean;
57
58
  'android:largeHeap'?: StringBoolean;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Manifest.ts"],"names":["writeAndroidManifestAsync","manifestPath","androidManifest","manifestXml","XML","format","fs","promises","mkdir","path","dirname","recursive","writeFile","readAndroidManifestAsync","xml","readXMLAsync","isManifest","Error","manifest","getMainApplication","application","filter","e","$","endsWith","getMainApplicationOrThrow","mainApplication","getMainActivityOrThrow","mainActivity","getMainActivity","getRunnableActivity","enabledActivities","activity","Array","isArray","intentFilter","action","find","category","addMetaDataItemToMainApplication","itemName","itemValue","itemType","existingMetaDataItem","newItem","prefixAndroidKeys","name","length","push","removeMetaDataItemFromMainApplication","index","findMetaDataItem","splice","findApplicationSubItem","parent","findIndex","findUsesLibraryItem","getMainApplicationMetaDataValue","hasOwnProperty","item","addUsesLibraryItemToMainApplication","removeUsesLibraryItemFromMainApplication","head","Object","entries","reduce","prev","key","curr","ensureToolsAvailable","ensureManifestHasNamespace","namespace","url"],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport fs from 'fs';\nimport path from 'path';\n\nimport * as XML from '../utils/XML';\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 'tools:node'?: string | 'remove';\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 ManifestReceiver = {\n $: AndroidManifestAttributes & {\n 'android:exported'?: StringBoolean;\n 'android:enabled'?: StringBoolean;\n };\n 'intent-filter'?: ManifestIntentFilter[];\n};\n\nexport type ManifestIntentFilter = {\n $?: {\n 'android:autoVerify'?: StringBoolean;\n 'data-generated'?: StringBoolean;\n };\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 'android:windowSoftInputMode'?:\n | string\n | 'stateUnspecified'\n | 'stateUnchanged'\n | 'stateHidden'\n | 'stateAlwaysHidden'\n | 'stateVisible'\n | 'stateAlwaysVisible'\n | 'adjustUnspecified'\n | 'adjustResize'\n | 'adjustPan';\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?: ManifestReceiver[];\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 $: {\n 'xmlns:android': string;\n 'xmlns:tools'?: string;\n package?: string;\n [key: string]: string | undefined;\n };\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.promises.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.promises.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\n/** Returns the `manifest.application` tag ending in `.MainApplication` */\nexport function getMainApplication(androidManifest: AndroidManifest): ManifestApplication | null {\n return (\n androidManifest?.manifest?.application?.filter(e =>\n e?.$?.['android:name'].endsWith('.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 getRunnableActivity(androidManifest: AndroidManifest): ManifestActivity | null {\n // Get enabled activities\n const enabledActivities = androidManifest?.manifest?.application?.[0]?.activity?.filter?.(\n (e: any) => e.$['android:enabled'] !== 'false' && e.$['android:enabled'] !== false\n );\n\n if (!enabledActivities) {\n return null;\n }\n\n // Get the activity that has a runnable intent-filter\n for (const activity of enabledActivities) {\n if (Array.isArray(activity['intent-filter'])) {\n for (const intentFilter of activity['intent-filter']) {\n if (\n intentFilter.action?.find(\n action => action.$['android:name'] === 'android.intent.action.MAIN'\n ) &&\n intentFilter.category?.find(\n category => category.$['android:name'] === 'android.intent.category.LAUNCHER'\n )\n ) {\n return activity;\n }\n }\n }\n }\n\n return null;\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\n/**\n * Ensure the `tools:*` namespace is available in the manifest.\n *\n * @param manifest AndroidManifest.xml\n * @returns manifest with the `tools:*` namespace available\n */\nexport function ensureToolsAvailable(manifest: AndroidManifest) {\n return ensureManifestHasNamespace(manifest, {\n namespace: 'xmlns:tools',\n url: 'http://schemas.android.com/tools',\n });\n}\n\n/**\n * Ensure a particular namespace is available in the manifest.\n *\n * @param manifest `AndroidManifest.xml`\n * @returns manifest with the provided namespace available\n */\nfunction ensureManifestHasNamespace(\n manifest: AndroidManifest,\n { namespace, url }: { namespace: string; url: string }\n) {\n if (manifest?.manifest?.$?.[namespace]) {\n return manifest;\n }\n manifest.manifest.$[namespace] = url;\n return manifest;\n}\n"],"file":"Manifest.js"}
1
+ {"version":3,"sources":["../../src/android/Manifest.ts"],"names":["writeAndroidManifestAsync","manifestPath","androidManifest","manifestXml","XML","format","fs","promises","mkdir","path","dirname","recursive","writeFile","readAndroidManifestAsync","xml","readXMLAsync","isManifest","Error","manifest","getMainApplication","application","filter","e","$","endsWith","getMainApplicationOrThrow","mainApplication","getMainActivityOrThrow","mainActivity","getMainActivity","getRunnableActivity","enabledActivities","activity","Array","isArray","intentFilter","action","find","category","addMetaDataItemToMainApplication","itemName","itemValue","itemType","existingMetaDataItem","newItem","prefixAndroidKeys","name","length","push","removeMetaDataItemFromMainApplication","index","findMetaDataItem","splice","findApplicationSubItem","parent","findIndex","findUsesLibraryItem","getMainApplicationMetaDataValue","hasOwnProperty","item","addUsesLibraryItemToMainApplication","removeUsesLibraryItemFromMainApplication","head","Object","entries","reduce","prev","key","curr","ensureToolsAvailable","ensureManifestHasNamespace","namespace","url"],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport fs from 'fs';\nimport path from 'path';\n\nimport * as XML from '../utils/XML';\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 'tools:node'?: string | 'remove';\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 ManifestReceiver = {\n $: AndroidManifestAttributes & {\n 'android:exported'?: StringBoolean;\n 'android:enabled'?: StringBoolean;\n };\n 'intent-filter'?: ManifestIntentFilter[];\n};\n\nexport type ManifestIntentFilter = {\n $?: {\n 'android:autoVerify'?: StringBoolean;\n 'data-generated'?: StringBoolean;\n };\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:roundIcon'?: 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 'android:windowSoftInputMode'?:\n | string\n | 'stateUnspecified'\n | 'stateUnchanged'\n | 'stateHidden'\n | 'stateAlwaysHidden'\n | 'stateVisible'\n | 'stateAlwaysVisible'\n | 'adjustUnspecified'\n | 'adjustResize'\n | 'adjustPan';\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?: ManifestReceiver[];\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 $: {\n 'xmlns:android': string;\n 'xmlns:tools'?: string;\n package?: string;\n [key: string]: string | undefined;\n };\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.promises.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.promises.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\n/** Returns the `manifest.application` tag ending in `.MainApplication` */\nexport function getMainApplication(androidManifest: AndroidManifest): ManifestApplication | null {\n return (\n androidManifest?.manifest?.application?.filter(e =>\n e?.$?.['android:name'].endsWith('.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 getRunnableActivity(androidManifest: AndroidManifest): ManifestActivity | null {\n // Get enabled activities\n const enabledActivities = androidManifest?.manifest?.application?.[0]?.activity?.filter?.(\n (e: any) => e.$['android:enabled'] !== 'false' && e.$['android:enabled'] !== false\n );\n\n if (!enabledActivities) {\n return null;\n }\n\n // Get the activity that has a runnable intent-filter\n for (const activity of enabledActivities) {\n if (Array.isArray(activity['intent-filter'])) {\n for (const intentFilter of activity['intent-filter']) {\n if (\n intentFilter.action?.find(\n action => action.$['android:name'] === 'android.intent.action.MAIN'\n ) &&\n intentFilter.category?.find(\n category => category.$['android:name'] === 'android.intent.category.LAUNCHER'\n )\n ) {\n return activity;\n }\n }\n }\n }\n\n return null;\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\n/**\n * Ensure the `tools:*` namespace is available in the manifest.\n *\n * @param manifest AndroidManifest.xml\n * @returns manifest with the `tools:*` namespace available\n */\nexport function ensureToolsAvailable(manifest: AndroidManifest) {\n return ensureManifestHasNamespace(manifest, {\n namespace: 'xmlns:tools',\n url: 'http://schemas.android.com/tools',\n });\n}\n\n/**\n * Ensure a particular namespace is available in the manifest.\n *\n * @param manifest `AndroidManifest.xml`\n * @returns manifest with the provided namespace available\n */\nfunction ensureManifestHasNamespace(\n manifest: AndroidManifest,\n { namespace, url }: { namespace: string; url: string }\n) {\n if (manifest?.manifest?.$?.[namespace]) {\n return manifest;\n }\n manifest.manifest.$[namespace] = url;\n return manifest;\n}\n"],"file":"Manifest.js"}
@@ -6,6 +6,11 @@ export declare const withPackageGradle: ConfigPlugin;
6
6
  export declare const withPackageRefactor: ConfigPlugin;
7
7
  export declare function getPackage(config: Pick<ExpoConfig, 'android'>): string | null;
8
8
  export declare function renamePackageOnDisk(config: Pick<ExpoConfig, 'android'>, projectRoot: string): Promise<void>;
9
+ export declare function renameJniOnDiskForType({ projectRoot, type, packageName, }: {
10
+ projectRoot: string;
11
+ type: string;
12
+ packageName: string;
13
+ }): Promise<void>;
9
14
  export declare function renamePackageOnDiskForType({ projectRoot, type, packageName, }: {
10
15
  projectRoot: string;
11
16
  type: string;
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.getApplicationIdAsync = getApplicationIdAsync;
7
7
  exports.getPackage = getPackage;
8
+ exports.renameJniOnDiskForType = renameJniOnDiskForType;
8
9
  exports.renamePackageOnDisk = renamePackageOnDisk;
9
10
  exports.renamePackageOnDiskForType = renamePackageOnDiskForType;
10
11
  exports.setPackageInAndroidManifest = setPackageInAndroidManifest;
@@ -186,6 +187,11 @@ async function renamePackageOnDisk(config, projectRoot) {
186
187
  }
187
188
 
188
189
  for (const type of ['main', 'debug']) {
190
+ await renameJniOnDiskForType({
191
+ projectRoot,
192
+ type,
193
+ packageName: newPackageName
194
+ });
189
195
  await renamePackageOnDiskForType({
190
196
  projectRoot,
191
197
  type,
@@ -194,6 +200,43 @@ async function renamePackageOnDisk(config, projectRoot) {
194
200
  }
195
201
  }
196
202
 
203
+ async function renameJniOnDiskForType({
204
+ projectRoot,
205
+ type,
206
+ packageName
207
+ }) {
208
+ if (!packageName) {
209
+ return;
210
+ }
211
+
212
+ const currentPackageName = getCurrentPackageNameForType(projectRoot, type);
213
+
214
+ if (!currentPackageName || !packageName || currentPackageName === packageName) {
215
+ return;
216
+ }
217
+
218
+ const jniRoot = _path().default.join(projectRoot, 'android', 'app', 'src', type, 'jni');
219
+
220
+ const filesToUpdate = [...(0, _glob().sync)('**/*', {
221
+ cwd: jniRoot,
222
+ absolute: true
223
+ })]; // Replace all occurrences of the path in the project
224
+
225
+ filesToUpdate.forEach(filepath => {
226
+ try {
227
+ if (_fs().default.lstatSync(filepath).isFile() && ['.h', '.cpp'].includes(_path().default.extname(filepath))) {
228
+ let contents = _fs().default.readFileSync(filepath).toString();
229
+
230
+ contents = contents.replace(new RegExp(transformJavaClassDescriptor(currentPackageName).replace(/\//g, '\\/'), 'g'), transformJavaClassDescriptor(packageName));
231
+
232
+ _fs().default.writeFileSync(filepath, contents);
233
+ }
234
+ } catch {
235
+ debug(`Error updating "${filepath}" for type "${type}"`);
236
+ }
237
+ });
238
+ }
239
+
197
240
  async function renamePackageOnDiskForType({
198
241
  projectRoot,
199
242
  type,
@@ -276,6 +319,10 @@ async function renamePackageOnDiskForType({
276
319
 
277
320
  contents = contents.replace(new RegExp(currentPackageName, 'g'), packageName);
278
321
 
322
+ if (['.h', '.cpp'].includes(_path().default.extname(filepath))) {
323
+ contents = contents.replace(new RegExp(transformJavaClassDescriptor(currentPackageName).replace(/\//g, '\\'), 'g'), transformJavaClassDescriptor(packageName));
324
+ }
325
+
279
326
  _fs().default.writeFileSync(filepath, contents);
280
327
  }
281
328
  } catch {
@@ -329,4 +376,13 @@ async function getApplicationIdAsync(projectRoot) {
329
376
 
330
377
  return (_matchResult$ = matchResult === null || matchResult === void 0 ? void 0 : matchResult[1]) !== null && _matchResult$ !== void 0 ? _matchResult$ : null;
331
378
  }
379
+ /**
380
+ * Transform a java package name to java class descriptor,
381
+ * e.g. `com.helloworld` -> `Lcom/helloworld`.
382
+ */
383
+
384
+
385
+ function transformJavaClassDescriptor(packageName) {
386
+ return `L${packageName.replace(/\./g, '/')}`;
387
+ }
332
388
  //# sourceMappingURL=Package.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Package.ts"],"names":["debug","withPackageManifest","setPackageInAndroidManifest","withPackageGradle","config","modResults","language","contents","setPackageInBuildGradle","withPackageRefactor","renamePackageOnDisk","modRequest","projectRoot","getPackage","android","package","getPackageRoot","type","path","join","getCurrentPackageName","packageRoot","mainApplication","packagePath","dirname","packagePathParts","relative","split","sep","filter","Boolean","getCurrentPackageForProjectFile","fileName","filePath","getCurrentPackageNameForType","newPackageName","renamePackageOnDiskForType","packageName","currentPackageName","currentPackagePath","newPackagePath","fs","mkdirSync","recursive","cwd","forEach","relativePath","filepath","lstatSync","isFile","moveFileSync","oldPathParts","length","pathToCheck","files","readdirSync","rmdirSync","pop","filesToUpdate","absolute","push","readFileSync","toString","replace","RegExp","writeFileSync","src","dest","renameSync","buildGradle","pattern","androidManifest","manifest","$","getApplicationIdAsync","buildGradlePath","existsSync","promises","readFile","matchResult","match"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport Debug from 'debug';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { createAndroidManifestPlugin, withAppBuildGradle } from '../plugins/android-plugins';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { directoryExistsAsync } from '../utils/modules';\nimport { addWarningAndroid } from '../utils/warnings';\nimport { AndroidManifest } from './Manifest';\nimport { getAppBuildGradleFilePath, getProjectFilePath } from './Paths';\n\nconst debug = Debug('expo:config-plugins:android:package');\n\nexport const withPackageManifest = createAndroidManifestPlugin(\n setPackageInAndroidManifest,\n 'withPackageManifest'\n);\n\nexport const withPackageGradle: ConfigPlugin = config => {\n return withAppBuildGradle(config, config => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = setPackageInBuildGradle(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.package',\n `Cannot automatically configure app build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\nexport const withPackageRefactor: ConfigPlugin = config => {\n return withDangerousMod(config, [\n 'android',\n async config => {\n await renamePackageOnDisk(config, config.modRequest.projectRoot);\n return config;\n },\n ]);\n};\n\nexport function getPackage(config: Pick<ExpoConfig, 'android'>) {\n return config.android?.package ?? null;\n}\n\nfunction getPackageRoot(projectRoot: string, type: 'main' | 'debug') {\n return path.join(projectRoot, 'android', 'app', 'src', type, 'java');\n}\n\nfunction getCurrentPackageName(projectRoot: string, packageRoot: string) {\n const mainApplication = getProjectFilePath(projectRoot, 'MainApplication');\n const packagePath = path.dirname(mainApplication);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageForProjectFile(\n projectRoot: string,\n packageRoot: string,\n fileName: string,\n type: string\n) {\n const filePath = globSync(\n path.join(projectRoot, `android/app/src/${type}/java/**/${fileName}.@(java|kt)`)\n )[0];\n\n if (!filePath) {\n return null;\n }\n\n const packagePath = path.dirname(filePath);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageNameForType(projectRoot: string, type: string): string | null {\n const packageRoot = getPackageRoot(projectRoot, type as any);\n\n if (type === 'main') {\n return getCurrentPackageName(projectRoot, packageRoot);\n }\n // debug, etc..\n return getCurrentPackageForProjectFile(projectRoot, packageRoot, '*', type);\n}\n\n// NOTE(brentvatne): this assumes that our MainApplication.java file is in the root of the package\n// this makes sense for standard react-native projects but may not apply in customized projects, so if\n// we want this to be runnable in any app we need to handle other possibilities\nexport async function renamePackageOnDisk(\n config: Pick<ExpoConfig, 'android'>,\n projectRoot: string\n) {\n const newPackageName = getPackage(config);\n if (newPackageName === null) {\n return;\n }\n\n for (const type of ['main', 'debug']) {\n await renamePackageOnDiskForType({ projectRoot, type, packageName: newPackageName });\n }\n}\n\nexport async function renamePackageOnDiskForType({\n projectRoot,\n type,\n packageName,\n}: {\n projectRoot: string;\n type: string;\n packageName: string;\n}) {\n if (!packageName) {\n return;\n }\n\n const currentPackageName = getCurrentPackageNameForType(projectRoot, type);\n debug(`Found package \"${currentPackageName}\" for type \"${type}\"`);\n if (!currentPackageName || currentPackageName === packageName) {\n return;\n }\n debug(`Refactor \"${currentPackageName}\" to \"${packageName}\" for type \"${type}\"`);\n const packageRoot = getPackageRoot(projectRoot, type as any);\n // Set up our paths\n if (!(await directoryExistsAsync(packageRoot))) {\n debug(`- skipping refactor of missing directory: ${packageRoot}`);\n return;\n }\n\n const currentPackagePath = path.join(packageRoot, ...currentPackageName.split('.'));\n const newPackagePath = path.join(packageRoot, ...packageName.split('.'));\n\n // Create the new directory\n fs.mkdirSync(newPackagePath, { recursive: true });\n\n // Move everything from the old directory over\n globSync('**/*', { cwd: currentPackagePath }).forEach(relativePath => {\n const filepath = path.join(currentPackagePath, relativePath);\n if (fs.lstatSync(filepath).isFile()) {\n moveFileSync(filepath, path.join(newPackagePath, relativePath));\n } else {\n fs.mkdirSync(filepath, { recursive: true });\n }\n });\n\n // Remove the old directory recursively from com/old/package to com/old and com,\n // as long as the directories are empty\n const oldPathParts = currentPackageName.split('.');\n while (oldPathParts.length) {\n const pathToCheck = path.join(packageRoot, ...oldPathParts);\n try {\n const files = fs.readdirSync(pathToCheck);\n if (files.length === 0) {\n fs.rmdirSync(pathToCheck);\n }\n } finally {\n oldPathParts.pop();\n }\n }\n\n const filesToUpdate = [...globSync('**/*', { cwd: newPackagePath, absolute: true })];\n // Only update the BUCK file to match the main package name\n if (type === 'main') {\n filesToUpdate.push(path.join(projectRoot, 'android', 'app', 'BUCK'));\n }\n // Replace all occurrences of the path in the project\n filesToUpdate.forEach((filepath: string) => {\n try {\n if (fs.lstatSync(filepath).isFile()) {\n let contents = fs.readFileSync(filepath).toString();\n contents = contents.replace(new RegExp(currentPackageName!, 'g'), packageName);\n fs.writeFileSync(filepath, contents);\n }\n } catch {\n debug(`Error updating \"${filepath}\" for type \"${type}\"`);\n }\n });\n}\n\nfunction moveFileSync(src: string, dest: string) {\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.renameSync(src, dest);\n}\n\nexport function setPackageInBuildGradle(config: Pick<ExpoConfig, 'android'>, buildGradle: string) {\n const packageName = getPackage(config);\n if (packageName === null) {\n return buildGradle;\n }\n\n const pattern = new RegExp(`applicationId ['\"].*['\"]`);\n return buildGradle.replace(pattern, `applicationId '${packageName}'`);\n}\n\nexport function setPackageInAndroidManifest(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const packageName = getPackage(config);\n\n if (packageName) {\n androidManifest.manifest.$.package = packageName;\n } else {\n delete androidManifest.manifest.$.package;\n }\n\n return androidManifest;\n}\n\nexport async function getApplicationIdAsync(projectRoot: string): Promise<string | null> {\n const buildGradlePath = getAppBuildGradleFilePath(projectRoot);\n if (!fs.existsSync(buildGradlePath)) {\n return null;\n }\n const buildGradle = await fs.promises.readFile(buildGradlePath, 'utf8');\n const matchResult = buildGradle.match(/applicationId ['\"](.*)['\"]/);\n // TODO add fallback for legacy cases to read from AndroidManifest.xml\n return matchResult?.[1] ?? null;\n}\n"],"file":"Package.js"}
1
+ {"version":3,"sources":["../../src/android/Package.ts"],"names":["debug","withPackageManifest","setPackageInAndroidManifest","withPackageGradle","config","modResults","language","contents","setPackageInBuildGradle","withPackageRefactor","renamePackageOnDisk","modRequest","projectRoot","getPackage","android","package","getPackageRoot","type","path","join","getCurrentPackageName","packageRoot","mainApplication","packagePath","dirname","packagePathParts","relative","split","sep","filter","Boolean","getCurrentPackageForProjectFile","fileName","filePath","getCurrentPackageNameForType","newPackageName","renameJniOnDiskForType","packageName","renamePackageOnDiskForType","currentPackageName","jniRoot","filesToUpdate","cwd","absolute","forEach","filepath","fs","lstatSync","isFile","includes","extname","readFileSync","toString","replace","RegExp","transformJavaClassDescriptor","writeFileSync","currentPackagePath","newPackagePath","mkdirSync","recursive","relativePath","moveFileSync","oldPathParts","length","pathToCheck","files","readdirSync","rmdirSync","pop","push","src","dest","renameSync","buildGradle","pattern","androidManifest","manifest","$","getApplicationIdAsync","buildGradlePath","existsSync","promises","readFile","matchResult","match"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport Debug from 'debug';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { createAndroidManifestPlugin, withAppBuildGradle } from '../plugins/android-plugins';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { directoryExistsAsync } from '../utils/modules';\nimport { addWarningAndroid } from '../utils/warnings';\nimport { AndroidManifest } from './Manifest';\nimport { getAppBuildGradleFilePath, getProjectFilePath } from './Paths';\n\nconst debug = Debug('expo:config-plugins:android:package');\n\nexport const withPackageManifest = createAndroidManifestPlugin(\n setPackageInAndroidManifest,\n 'withPackageManifest'\n);\n\nexport const withPackageGradle: ConfigPlugin = config => {\n return withAppBuildGradle(config, config => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = setPackageInBuildGradle(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.package',\n `Cannot automatically configure app build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\nexport const withPackageRefactor: ConfigPlugin = config => {\n return withDangerousMod(config, [\n 'android',\n async config => {\n await renamePackageOnDisk(config, config.modRequest.projectRoot);\n return config;\n },\n ]);\n};\n\nexport function getPackage(config: Pick<ExpoConfig, 'android'>) {\n return config.android?.package ?? null;\n}\n\nfunction getPackageRoot(projectRoot: string, type: 'main' | 'debug') {\n return path.join(projectRoot, 'android', 'app', 'src', type, 'java');\n}\n\nfunction getCurrentPackageName(projectRoot: string, packageRoot: string) {\n const mainApplication = getProjectFilePath(projectRoot, 'MainApplication');\n const packagePath = path.dirname(mainApplication);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageForProjectFile(\n projectRoot: string,\n packageRoot: string,\n fileName: string,\n type: string\n) {\n const filePath = globSync(\n path.join(projectRoot, `android/app/src/${type}/java/**/${fileName}.@(java|kt)`)\n )[0];\n\n if (!filePath) {\n return null;\n }\n\n const packagePath = path.dirname(filePath);\n const packagePathParts = path.relative(packageRoot, packagePath).split(path.sep).filter(Boolean);\n\n return packagePathParts.join('.');\n}\n\nfunction getCurrentPackageNameForType(projectRoot: string, type: string): string | null {\n const packageRoot = getPackageRoot(projectRoot, type as any);\n\n if (type === 'main') {\n return getCurrentPackageName(projectRoot, packageRoot);\n }\n // debug, etc..\n return getCurrentPackageForProjectFile(projectRoot, packageRoot, '*', type);\n}\n\n// NOTE(brentvatne): this assumes that our MainApplication.java file is in the root of the package\n// this makes sense for standard react-native projects but may not apply in customized projects, so if\n// we want this to be runnable in any app we need to handle other possibilities\nexport async function renamePackageOnDisk(\n config: Pick<ExpoConfig, 'android'>,\n projectRoot: string\n) {\n const newPackageName = getPackage(config);\n if (newPackageName === null) {\n return;\n }\n\n for (const type of ['main', 'debug']) {\n await renameJniOnDiskForType({ projectRoot, type, packageName: newPackageName });\n await renamePackageOnDiskForType({ projectRoot, type, packageName: newPackageName });\n }\n}\n\nexport async function renameJniOnDiskForType({\n projectRoot,\n type,\n packageName,\n}: {\n projectRoot: string;\n type: string;\n packageName: string;\n}) {\n if (!packageName) {\n return;\n }\n\n const currentPackageName = getCurrentPackageNameForType(projectRoot, type);\n if (!currentPackageName || !packageName || currentPackageName === packageName) {\n return;\n }\n\n const jniRoot = path.join(projectRoot, 'android', 'app', 'src', type, 'jni');\n const filesToUpdate = [...globSync('**/*', { cwd: jniRoot, absolute: true })];\n // Replace all occurrences of the path in the project\n filesToUpdate.forEach((filepath: string) => {\n try {\n if (fs.lstatSync(filepath).isFile() && ['.h', '.cpp'].includes(path.extname(filepath))) {\n let contents = fs.readFileSync(filepath).toString();\n contents = contents.replace(\n new RegExp(transformJavaClassDescriptor(currentPackageName).replace(/\\//g, '\\\\/'), 'g'),\n transformJavaClassDescriptor(packageName)\n );\n fs.writeFileSync(filepath, contents);\n }\n } catch {\n debug(`Error updating \"${filepath}\" for type \"${type}\"`);\n }\n });\n}\n\nexport async function renamePackageOnDiskForType({\n projectRoot,\n type,\n packageName,\n}: {\n projectRoot: string;\n type: string;\n packageName: string;\n}) {\n if (!packageName) {\n return;\n }\n\n const currentPackageName = getCurrentPackageNameForType(projectRoot, type);\n debug(`Found package \"${currentPackageName}\" for type \"${type}\"`);\n if (!currentPackageName || currentPackageName === packageName) {\n return;\n }\n debug(`Refactor \"${currentPackageName}\" to \"${packageName}\" for type \"${type}\"`);\n const packageRoot = getPackageRoot(projectRoot, type as any);\n // Set up our paths\n if (!(await directoryExistsAsync(packageRoot))) {\n debug(`- skipping refactor of missing directory: ${packageRoot}`);\n return;\n }\n\n const currentPackagePath = path.join(packageRoot, ...currentPackageName.split('.'));\n const newPackagePath = path.join(packageRoot, ...packageName.split('.'));\n\n // Create the new directory\n fs.mkdirSync(newPackagePath, { recursive: true });\n\n // Move everything from the old directory over\n globSync('**/*', { cwd: currentPackagePath }).forEach(relativePath => {\n const filepath = path.join(currentPackagePath, relativePath);\n if (fs.lstatSync(filepath).isFile()) {\n moveFileSync(filepath, path.join(newPackagePath, relativePath));\n } else {\n fs.mkdirSync(filepath, { recursive: true });\n }\n });\n\n // Remove the old directory recursively from com/old/package to com/old and com,\n // as long as the directories are empty\n const oldPathParts = currentPackageName.split('.');\n while (oldPathParts.length) {\n const pathToCheck = path.join(packageRoot, ...oldPathParts);\n try {\n const files = fs.readdirSync(pathToCheck);\n if (files.length === 0) {\n fs.rmdirSync(pathToCheck);\n }\n } finally {\n oldPathParts.pop();\n }\n }\n\n const filesToUpdate = [...globSync('**/*', { cwd: newPackagePath, absolute: true })];\n // Only update the BUCK file to match the main package name\n if (type === 'main') {\n filesToUpdate.push(path.join(projectRoot, 'android', 'app', 'BUCK'));\n }\n // Replace all occurrences of the path in the project\n filesToUpdate.forEach((filepath: string) => {\n try {\n if (fs.lstatSync(filepath).isFile()) {\n let contents = fs.readFileSync(filepath).toString();\n contents = contents.replace(new RegExp(currentPackageName!, 'g'), packageName);\n if (['.h', '.cpp'].includes(path.extname(filepath))) {\n contents = contents.replace(\n new RegExp(transformJavaClassDescriptor(currentPackageName).replace(/\\//g, '\\\\'), 'g'),\n transformJavaClassDescriptor(packageName)\n );\n }\n fs.writeFileSync(filepath, contents);\n }\n } catch {\n debug(`Error updating \"${filepath}\" for type \"${type}\"`);\n }\n });\n}\n\nfunction moveFileSync(src: string, dest: string) {\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.renameSync(src, dest);\n}\n\nexport function setPackageInBuildGradle(config: Pick<ExpoConfig, 'android'>, buildGradle: string) {\n const packageName = getPackage(config);\n if (packageName === null) {\n return buildGradle;\n }\n\n const pattern = new RegExp(`applicationId ['\"].*['\"]`);\n return buildGradle.replace(pattern, `applicationId '${packageName}'`);\n}\n\nexport function setPackageInAndroidManifest(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const packageName = getPackage(config);\n\n if (packageName) {\n androidManifest.manifest.$.package = packageName;\n } else {\n delete androidManifest.manifest.$.package;\n }\n\n return androidManifest;\n}\n\nexport async function getApplicationIdAsync(projectRoot: string): Promise<string | null> {\n const buildGradlePath = getAppBuildGradleFilePath(projectRoot);\n if (!fs.existsSync(buildGradlePath)) {\n return null;\n }\n const buildGradle = await fs.promises.readFile(buildGradlePath, 'utf8');\n const matchResult = buildGradle.match(/applicationId ['\"](.*)['\"]/);\n // TODO add fallback for legacy cases to read from AndroidManifest.xml\n return matchResult?.[1] ?? null;\n}\n\n/**\n * Transform a java package name to java class descriptor,\n * e.g. `com.helloworld` -> `Lcom/helloworld`.\n */\nfunction transformJavaClassDescriptor(packageName: string) {\n return `L${packageName.replace(/\\./g, '/')}`;\n}\n"],"file":"Package.js"}
@@ -26,16 +26,6 @@ function _androidPlugins() {
26
26
  return data;
27
27
  }
28
28
 
29
- function WarningAggregator() {
30
- const data = _interopRequireWildcard(require("../utils/warnings"));
31
-
32
- WarningAggregator = function () {
33
- return data;
34
- };
35
-
36
- return data;
37
- }
38
-
39
29
  function _Manifest() {
40
30
  const data = require("./Manifest");
41
31
 
@@ -46,10 +36,6 @@ function _Manifest() {
46
36
  return data;
47
37
  }
48
38
 
49
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
50
-
51
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
52
-
53
39
  const USES_PERMISSION = 'uses-permission';
54
40
 
55
41
  const withPermissions = (config, permissions) => {
@@ -76,10 +62,6 @@ const withBlockedPermissions = (config, permissions) => {
76
62
 
77
63
  const resolvedPermissions = (Array.isArray(permissions) ? permissions : [permissions]).filter(Boolean);
78
64
 
79
- if (!resolvedPermissions.length) {
80
- WarningAggregator().addWarningAndroid('block-permissions', 'No permissions provided');
81
- }
82
-
83
65
  if (config !== null && config !== void 0 && (_config$android = config.android) !== null && _config$android !== void 0 && _config$android.permissions && Array.isArray(config.android.permissions)) {
84
66
  // Remove any static config permissions
85
67
  config.android.permissions = config.android.permissions.filter(permission => !resolvedPermissions.includes(permission));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/android/Permissions.ts"],"names":["USES_PERMISSION","withPermissions","config","permissions","Array","isArray","filter","Boolean","android","Set","concat","modResults","setAndroidPermissions","withBlockedPermissions","resolvedPermissions","length","WarningAggregator","addWarningAndroid","permission","includes","addBlockedPermissions","withInternalBlockedPermissions","blockedPermissions","androidManifest","manifest","ensureBlockedPermission","manifestPermissions","e","$","push","prefixAndroidPermissionsIfNecessary","map","getAndroidPermissions","providedPermissions","permissionsToAdd","hasOwnProperty","forEach","isPermissionAlreadyRequested","addPermissionToManifest","some","removePermissions","permissionNames","targetNames","ensurePermissionNameFormat","nextPermissions","attribute","value","name","addPermission","permissionName","usesPermissions","ensurePermissions","getPermissions","results","targetName","ensurePermission","com","split","pop","toUpperCase","join","permissionObject"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport * as WarningAggregator from '../utils/warnings';\nimport { AndroidManifest, ensureToolsAvailable, ManifestUsesPermission } from './Manifest';\n\nconst USES_PERMISSION = 'uses-permission';\n\nexport const withPermissions: ConfigPlugin<string[] | void> = (config, permissions) => {\n if (Array.isArray(permissions)) {\n permissions = permissions.filter(Boolean);\n if (!config.android) config.android = {};\n if (!config.android.permissions) config.android.permissions = [];\n config.android.permissions = [\n // @ts-ignore\n ...new Set(config.android.permissions.concat(permissions)),\n ];\n }\n return withAndroidManifest(config, async config => {\n config.modResults = await setAndroidPermissions(config, config.modResults);\n return config;\n });\n};\n\n/** Given a permission or list of permissions, block permissions in the final `AndroidManifest.xml` to ensure no installed library or plugin can add them. */\nexport const withBlockedPermissions: ConfigPlugin<string[] | string> = (config, permissions) => {\n const resolvedPermissions = (Array.isArray(permissions) ? permissions : [permissions]).filter(\n Boolean\n );\n\n if (!resolvedPermissions.length) {\n WarningAggregator.addWarningAndroid('block-permissions', 'No permissions provided');\n }\n\n if (config?.android?.permissions && Array.isArray(config.android.permissions)) {\n // Remove any static config permissions\n config.android.permissions = config.android.permissions.filter(\n permission => !resolvedPermissions.includes(permission)\n );\n }\n\n return withAndroidManifest(config, async config => {\n config.modResults = ensureToolsAvailable(config.modResults);\n config.modResults = addBlockedPermissions(config.modResults, resolvedPermissions);\n return config;\n });\n};\n\nexport const withInternalBlockedPermissions: ConfigPlugin = config => {\n // Only add permissions if the user defined the property and added some values\n // this ensures we don't add the `tools:*` namespace extraneously.\n if (config.android?.blockedPermissions?.length) {\n return withBlockedPermissions(config, config.android.blockedPermissions);\n }\n\n return config;\n};\n\nexport function addBlockedPermissions(androidManifest: AndroidManifest, permissions: string[]) {\n if (!Array.isArray(androidManifest.manifest['uses-permission'])) {\n androidManifest.manifest['uses-permission'] = [];\n }\n\n for (const permission of permissions) {\n androidManifest.manifest['uses-permission'] = ensureBlockedPermission(\n androidManifest.manifest['uses-permission'],\n permission\n );\n }\n\n return androidManifest;\n}\n\n/**\n * Filter any existing permissions matching the provided permission name, then add a\n * restricted permission to overwrite any extra permissions that may be added in a\n * third-party package's AndroidManifest.xml.\n *\n * @param manifestPermissions manifest `uses-permissions` array.\n * @param permission `android:name` of the permission to restrict\n * @returns\n */\nfunction ensureBlockedPermission(\n manifestPermissions: ManifestUsesPermission[],\n permission: string\n) {\n // Remove permission if it currently exists\n manifestPermissions = manifestPermissions.filter(e => e.$['android:name'] !== permission);\n\n // Add a permission with tools:node to overwrite any existing permission and ensure it's removed upon building.\n manifestPermissions.push({\n $: { 'android:name': permission, 'tools:node': 'remove' },\n });\n return manifestPermissions;\n}\n\nfunction prefixAndroidPermissionsIfNecessary(permissions: string[]): string[] {\n return permissions.map(permission => {\n if (!permission.includes('.')) {\n return `android.permission.${permission}`;\n }\n return permission;\n });\n}\n\nexport function getAndroidPermissions(config: Pick<ExpoConfig, 'android'>): string[] {\n return config.android?.permissions ?? [];\n}\n\nexport function setAndroidPermissions(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const permissions = getAndroidPermissions(config);\n const providedPermissions = prefixAndroidPermissionsIfNecessary(permissions);\n const permissionsToAdd = [...providedPermissions];\n\n if (!androidManifest.manifest.hasOwnProperty('uses-permission')) {\n androidManifest.manifest['uses-permission'] = [];\n }\n // manifest.manifest['uses-permission'] = [];\n\n const manifestPermissions = androidManifest.manifest['uses-permission'] ?? [];\n\n permissionsToAdd.forEach(permission => {\n if (!isPermissionAlreadyRequested(permission, manifestPermissions)) {\n addPermissionToManifest(permission, manifestPermissions);\n }\n });\n\n return androidManifest;\n}\n\nexport function isPermissionAlreadyRequested(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n): boolean {\n return manifestPermissions.some(e => e.$['android:name'] === permission);\n}\n\nexport function addPermissionToManifest(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n) {\n manifestPermissions.push({ $: { 'android:name': permission } });\n return manifestPermissions;\n}\n\nexport function removePermissions(androidManifest: AndroidManifest, permissionNames?: string[]) {\n const targetNames = permissionNames ? permissionNames.map(ensurePermissionNameFormat) : null;\n const permissions = androidManifest.manifest[USES_PERMISSION] || [];\n const nextPermissions = [];\n for (const attribute of permissions) {\n if (targetNames) {\n // @ts-ignore: name isn't part of the type\n const value = attribute.$['android:name'] || attribute.$.name;\n if (!targetNames.includes(value)) {\n nextPermissions.push(attribute);\n }\n }\n }\n\n androidManifest.manifest[USES_PERMISSION] = nextPermissions;\n}\n\nexport function addPermission(androidManifest: AndroidManifest, permissionName: string): void {\n const usesPermissions: ManifestUsesPermission[] = androidManifest.manifest[USES_PERMISSION] || [];\n usesPermissions.push({\n $: { 'android:name': permissionName },\n });\n androidManifest.manifest[USES_PERMISSION] = usesPermissions;\n}\n\nexport function ensurePermissions(\n androidManifest: AndroidManifest,\n permissionNames: string[]\n): { [permission: string]: boolean } {\n const permissions = getPermissions(androidManifest);\n\n const results: { [permission: string]: boolean } = {};\n for (const permissionName of permissionNames) {\n const targetName = ensurePermissionNameFormat(permissionName);\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n results[permissionName] = true;\n } else {\n results[permissionName] = false;\n }\n }\n return results;\n}\n\nexport function ensurePermission(\n androidManifest: AndroidManifest,\n permissionName: string\n): boolean {\n const permissions = getPermissions(androidManifest);\n const targetName = ensurePermissionNameFormat(permissionName);\n\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n return true;\n }\n return false;\n}\n\nexport function ensurePermissionNameFormat(permissionName: string): string {\n if (permissionName.includes('.')) {\n const com = permissionName.split('.');\n const name = com.pop() as string;\n return [...com, name.toUpperCase()].join('.');\n } else {\n // If shorthand form like `WRITE_CONTACTS` is provided, expand it to `android.permission.WRITE_CONTACTS`.\n return ensurePermissionNameFormat(`android.permission.${permissionName}`);\n }\n}\n\nexport function getPermissions(androidManifest: AndroidManifest): string[] {\n const usesPermissions: { [key: string]: any }[] = androidManifest.manifest[USES_PERMISSION] || [];\n const permissions = usesPermissions.map(permissionObject => {\n return permissionObject.$['android:name'] || permissionObject.$.name;\n });\n return permissions;\n}\n"],"file":"Permissions.js"}
1
+ {"version":3,"sources":["../../src/android/Permissions.ts"],"names":["USES_PERMISSION","withPermissions","config","permissions","Array","isArray","filter","Boolean","android","Set","concat","modResults","setAndroidPermissions","withBlockedPermissions","resolvedPermissions","permission","includes","addBlockedPermissions","withInternalBlockedPermissions","blockedPermissions","length","androidManifest","manifest","ensureBlockedPermission","manifestPermissions","e","$","push","prefixAndroidPermissionsIfNecessary","map","getAndroidPermissions","providedPermissions","permissionsToAdd","hasOwnProperty","forEach","isPermissionAlreadyRequested","addPermissionToManifest","some","removePermissions","permissionNames","targetNames","ensurePermissionNameFormat","nextPermissions","attribute","value","name","addPermission","permissionName","usesPermissions","ensurePermissions","getPermissions","results","targetName","ensurePermission","com","split","pop","toUpperCase","join","permissionObject"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport { AndroidManifest, ensureToolsAvailable, ManifestUsesPermission } from './Manifest';\n\nconst USES_PERMISSION = 'uses-permission';\n\nexport const withPermissions: ConfigPlugin<string[] | void> = (config, permissions) => {\n if (Array.isArray(permissions)) {\n permissions = permissions.filter(Boolean);\n if (!config.android) config.android = {};\n if (!config.android.permissions) config.android.permissions = [];\n config.android.permissions = [\n // @ts-ignore\n ...new Set(config.android.permissions.concat(permissions)),\n ];\n }\n return withAndroidManifest(config, async config => {\n config.modResults = await setAndroidPermissions(config, config.modResults);\n return config;\n });\n};\n\n/** Given a permission or list of permissions, block permissions in the final `AndroidManifest.xml` to ensure no installed library or plugin can add them. */\nexport const withBlockedPermissions: ConfigPlugin<string[] | string> = (config, permissions) => {\n const resolvedPermissions = (Array.isArray(permissions) ? permissions : [permissions]).filter(\n Boolean\n );\n\n if (config?.android?.permissions && Array.isArray(config.android.permissions)) {\n // Remove any static config permissions\n config.android.permissions = config.android.permissions.filter(\n permission => !resolvedPermissions.includes(permission)\n );\n }\n\n return withAndroidManifest(config, async config => {\n config.modResults = ensureToolsAvailable(config.modResults);\n config.modResults = addBlockedPermissions(config.modResults, resolvedPermissions);\n return config;\n });\n};\n\nexport const withInternalBlockedPermissions: ConfigPlugin = config => {\n // Only add permissions if the user defined the property and added some values\n // this ensures we don't add the `tools:*` namespace extraneously.\n if (config.android?.blockedPermissions?.length) {\n return withBlockedPermissions(config, config.android.blockedPermissions);\n }\n\n return config;\n};\n\nexport function addBlockedPermissions(androidManifest: AndroidManifest, permissions: string[]) {\n if (!Array.isArray(androidManifest.manifest['uses-permission'])) {\n androidManifest.manifest['uses-permission'] = [];\n }\n\n for (const permission of permissions) {\n androidManifest.manifest['uses-permission'] = ensureBlockedPermission(\n androidManifest.manifest['uses-permission'],\n permission\n );\n }\n\n return androidManifest;\n}\n\n/**\n * Filter any existing permissions matching the provided permission name, then add a\n * restricted permission to overwrite any extra permissions that may be added in a\n * third-party package's AndroidManifest.xml.\n *\n * @param manifestPermissions manifest `uses-permissions` array.\n * @param permission `android:name` of the permission to restrict\n * @returns\n */\nfunction ensureBlockedPermission(\n manifestPermissions: ManifestUsesPermission[],\n permission: string\n) {\n // Remove permission if it currently exists\n manifestPermissions = manifestPermissions.filter(e => e.$['android:name'] !== permission);\n\n // Add a permission with tools:node to overwrite any existing permission and ensure it's removed upon building.\n manifestPermissions.push({\n $: { 'android:name': permission, 'tools:node': 'remove' },\n });\n return manifestPermissions;\n}\n\nfunction prefixAndroidPermissionsIfNecessary(permissions: string[]): string[] {\n return permissions.map(permission => {\n if (!permission.includes('.')) {\n return `android.permission.${permission}`;\n }\n return permission;\n });\n}\n\nexport function getAndroidPermissions(config: Pick<ExpoConfig, 'android'>): string[] {\n return config.android?.permissions ?? [];\n}\n\nexport function setAndroidPermissions(\n config: Pick<ExpoConfig, 'android'>,\n androidManifest: AndroidManifest\n) {\n const permissions = getAndroidPermissions(config);\n const providedPermissions = prefixAndroidPermissionsIfNecessary(permissions);\n const permissionsToAdd = [...providedPermissions];\n\n if (!androidManifest.manifest.hasOwnProperty('uses-permission')) {\n androidManifest.manifest['uses-permission'] = [];\n }\n // manifest.manifest['uses-permission'] = [];\n\n const manifestPermissions = androidManifest.manifest['uses-permission'] ?? [];\n\n permissionsToAdd.forEach(permission => {\n if (!isPermissionAlreadyRequested(permission, manifestPermissions)) {\n addPermissionToManifest(permission, manifestPermissions);\n }\n });\n\n return androidManifest;\n}\n\nexport function isPermissionAlreadyRequested(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n): boolean {\n return manifestPermissions.some(e => e.$['android:name'] === permission);\n}\n\nexport function addPermissionToManifest(\n permission: string,\n manifestPermissions: ManifestUsesPermission[]\n) {\n manifestPermissions.push({ $: { 'android:name': permission } });\n return manifestPermissions;\n}\n\nexport function removePermissions(androidManifest: AndroidManifest, permissionNames?: string[]) {\n const targetNames = permissionNames ? permissionNames.map(ensurePermissionNameFormat) : null;\n const permissions = androidManifest.manifest[USES_PERMISSION] || [];\n const nextPermissions = [];\n for (const attribute of permissions) {\n if (targetNames) {\n // @ts-ignore: name isn't part of the type\n const value = attribute.$['android:name'] || attribute.$.name;\n if (!targetNames.includes(value)) {\n nextPermissions.push(attribute);\n }\n }\n }\n\n androidManifest.manifest[USES_PERMISSION] = nextPermissions;\n}\n\nexport function addPermission(androidManifest: AndroidManifest, permissionName: string): void {\n const usesPermissions: ManifestUsesPermission[] = androidManifest.manifest[USES_PERMISSION] || [];\n usesPermissions.push({\n $: { 'android:name': permissionName },\n });\n androidManifest.manifest[USES_PERMISSION] = usesPermissions;\n}\n\nexport function ensurePermissions(\n androidManifest: AndroidManifest,\n permissionNames: string[]\n): { [permission: string]: boolean } {\n const permissions = getPermissions(androidManifest);\n\n const results: { [permission: string]: boolean } = {};\n for (const permissionName of permissionNames) {\n const targetName = ensurePermissionNameFormat(permissionName);\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n results[permissionName] = true;\n } else {\n results[permissionName] = false;\n }\n }\n return results;\n}\n\nexport function ensurePermission(\n androidManifest: AndroidManifest,\n permissionName: string\n): boolean {\n const permissions = getPermissions(androidManifest);\n const targetName = ensurePermissionNameFormat(permissionName);\n\n if (!permissions.includes(targetName)) {\n addPermission(androidManifest, targetName);\n return true;\n }\n return false;\n}\n\nexport function ensurePermissionNameFormat(permissionName: string): string {\n if (permissionName.includes('.')) {\n const com = permissionName.split('.');\n const name = com.pop() as string;\n return [...com, name.toUpperCase()].join('.');\n } else {\n // If shorthand form like `WRITE_CONTACTS` is provided, expand it to `android.permission.WRITE_CONTACTS`.\n return ensurePermissionNameFormat(`android.permission.${permissionName}`);\n }\n}\n\nexport function getPermissions(androidManifest: AndroidManifest): string[] {\n const usesPermissions: { [key: string]: any }[] = androidManifest.manifest[USES_PERMISSION] || [];\n const permissions = usesPermissions.map(permissionObject => {\n return permissionObject.$['android:name'] || permissionObject.$.name;\n });\n return permissions;\n}\n"],"file":"Permissions.js"}
@@ -35,6 +35,16 @@ function _Xcodeproj() {
35
35
  return data;
36
36
  }
37
37
 
38
+ function _string() {
39
+ const data = require("./utils/string");
40
+
41
+ _string = function () {
42
+ return data;
43
+ };
44
+
45
+ return data;
46
+ }
47
+
38
48
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
49
 
40
50
  function setProvisioningProfileForPbxproj(projectRoot, {
@@ -47,7 +57,7 @@ function setProvisioningProfileForPbxproj(projectRoot, {
47
57
  const nativeTargetEntry = targetName ? (0, _Target().findNativeTargetByName)(project, targetName) : (0, _Target().findFirstNativeTarget)(project);
48
58
  const [nativeTargetId, nativeTarget] = nativeTargetEntry;
49
59
  const quotedAppleTeamId = ensureQuotes(appleTeamId);
50
- (0, _Xcodeproj().getBuildConfigurationsForListId)(project, nativeTarget.buildConfigurationList).filter(([, item]) => item.name === buildConfiguration).forEach(([, item]) => {
60
+ (0, _Xcodeproj().getBuildConfigurationsForListId)(project, nativeTarget.buildConfigurationList).filter(([, item]) => (0, _string().trimQuotes)(item.name) === buildConfiguration).forEach(([, item]) => {
51
61
  item.buildSettings.PROVISIONING_PROFILE_SPECIFIER = `"${profileName}"`;
52
62
  item.buildSettings.DEVELOPMENT_TEAM = quotedAppleTeamId;
53
63
  item.buildSettings.CODE_SIGN_IDENTITY = '"iPhone Distribution"';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ios/ProvisioningProfile.ts"],"names":["setProvisioningProfileForPbxproj","projectRoot","targetName","profileName","appleTeamId","buildConfiguration","project","nativeTargetEntry","nativeTargetId","nativeTarget","quotedAppleTeamId","ensureQuotes","buildConfigurationList","filter","item","name","forEach","buildSettings","PROVISIONING_PROFILE_SPECIFIER","DEVELOPMENT_TEAM","CODE_SIGN_IDENTITY","CODE_SIGN_STYLE","Object","entries","isNotComment","attributes","TargetAttributes","DevelopmentTeam","ProvisioningStyle","fs","writeFileSync","filepath","writeSync","value","match"],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAgBO,SAASA,gCAAT,CACLC,WADK,EAEL;AACEC,EAAAA,UADF;AAEEC,EAAAA,WAFF;AAGEC,EAAAA,WAHF;AAIEC,EAAAA,kBAAkB,GAAG;AAJvB,CAFK,EAQC;AACN,QAAMC,OAAO,GAAG,6BAAWL,WAAX,CAAhB;AAEA,QAAMM,iBAAiB,GAAGL,UAAU,GAChC,sCAAuBI,OAAvB,EAAgCJ,UAAhC,CADgC,GAEhC,qCAAsBI,OAAtB,CAFJ;AAGA,QAAM,CAACE,cAAD,EAAiBC,YAAjB,IAAiCF,iBAAvC;AAEA,QAAMG,iBAAiB,GAAGC,YAAY,CAACP,WAAD,CAAtC;AAEA,oDAAgCE,OAAhC,EAAyCG,YAAY,CAACG,sBAAtD,EACGC,MADH,CACU,CAAC,GAAGC,IAAH,CAAD,KAAyCA,IAAI,CAACC,IAAL,KAAcV,kBADjE,EAEGW,OAFH,CAEW,CAAC,GAAGF,IAAH,CAAD,KAAyC;AAChDA,IAAAA,IAAI,CAACG,aAAL,CAAmBC,8BAAnB,GAAqD,IAAGf,WAAY,GAApE;AACAW,IAAAA,IAAI,CAACG,aAAL,CAAmBE,gBAAnB,GAAsCT,iBAAtC;AACAI,IAAAA,IAAI,CAACG,aAAL,CAAmBG,kBAAnB,GAAwC,uBAAxC;AACAN,IAAAA,IAAI,CAACG,aAAL,CAAmBI,eAAnB,GAAqC,QAArC;AACD,GAPH;AASAC,EAAAA,MAAM,CAACC,OAAP,CAAe,oCAAkBjB,OAAlB,CAAf,EACGO,MADH,CACUW,yBADV,EAEGR,OAFH,CAEW,CAAC,GAAGF,IAAH,CAAD,KAAmC;AAC1C,QAAI,CAACA,IAAI,CAACW,UAAL,CAAgBC,gBAAhB,CAAiClB,cAAjC,CAAL,EAAuD;AACrDM,MAAAA,IAAI,CAACW,UAAL,CAAgBC,gBAAhB,CAAiClB,cAAjC,IAAmD,EAAnD;AACD;;AACDM,IAAAA,IAAI,CAACW,UAAL,CAAgBC,gBAAhB,CAAiClB,cAAjC,EAAiDmB,eAAjD,GAAmEjB,iBAAnE;AACAI,IAAAA,IAAI,CAACW,UAAL,CAAgBC,gBAAhB,CAAiClB,cAAjC,EAAiDoB,iBAAjD,GAAqE,QAArE;AACD,GARH;;AAUAC,gBAAGC,aAAH,CAAiBxB,OAAO,CAACyB,QAAzB,EAAmCzB,OAAO,CAAC0B,SAAR,EAAnC;AACD;;AAED,MAAMrB,YAAY,GAAIsB,KAAD,IAAmB;AACtC,MAAI,CAACA,KAAK,CAACC,KAAN,CAAY,OAAZ,CAAL,EAA2B;AACzB,WAAQ,IAAGD,KAAM,GAAjB;AACD;;AACD,SAAOA,KAAP;AACD,CALD","sourcesContent":["import fs from 'fs';\n\nimport { findFirstNativeTarget, findNativeTargetByName } from './Target';\nimport {\n ConfigurationSectionEntry,\n getBuildConfigurationsForListId,\n getPbxproj,\n getProjectSection,\n isNotComment,\n ProjectSectionEntry,\n} from './utils/Xcodeproj';\n\ntype ProvisioningProfileSettings = {\n targetName?: string;\n appleTeamId: string;\n profileName: string;\n buildConfiguration?: string;\n};\n\nexport function setProvisioningProfileForPbxproj(\n projectRoot: string,\n {\n targetName,\n profileName,\n appleTeamId,\n buildConfiguration = 'Release',\n }: ProvisioningProfileSettings\n): void {\n const project = getPbxproj(projectRoot);\n\n const nativeTargetEntry = targetName\n ? findNativeTargetByName(project, targetName)\n : findFirstNativeTarget(project);\n const [nativeTargetId, nativeTarget] = nativeTargetEntry;\n\n const quotedAppleTeamId = ensureQuotes(appleTeamId);\n\n getBuildConfigurationsForListId(project, nativeTarget.buildConfigurationList)\n .filter(([, item]: ConfigurationSectionEntry) => item.name === buildConfiguration)\n .forEach(([, item]: ConfigurationSectionEntry) => {\n item.buildSettings.PROVISIONING_PROFILE_SPECIFIER = `\"${profileName}\"`;\n item.buildSettings.DEVELOPMENT_TEAM = quotedAppleTeamId;\n item.buildSettings.CODE_SIGN_IDENTITY = '\"iPhone Distribution\"';\n item.buildSettings.CODE_SIGN_STYLE = 'Manual';\n });\n\n Object.entries(getProjectSection(project))\n .filter(isNotComment)\n .forEach(([, item]: ProjectSectionEntry) => {\n if (!item.attributes.TargetAttributes[nativeTargetId]) {\n item.attributes.TargetAttributes[nativeTargetId] = {};\n }\n item.attributes.TargetAttributes[nativeTargetId].DevelopmentTeam = quotedAppleTeamId;\n item.attributes.TargetAttributes[nativeTargetId].ProvisioningStyle = 'Manual';\n });\n\n fs.writeFileSync(project.filepath, project.writeSync());\n}\n\nconst ensureQuotes = (value: string) => {\n if (!value.match(/^['\"]/)) {\n return `\"${value}\"`;\n }\n return value;\n};\n"],"file":"ProvisioningProfile.js"}
1
+ {"version":3,"sources":["../../src/ios/ProvisioningProfile.ts"],"names":["setProvisioningProfileForPbxproj","projectRoot","targetName","profileName","appleTeamId","buildConfiguration","project","nativeTargetEntry","nativeTargetId","nativeTarget","quotedAppleTeamId","ensureQuotes","buildConfigurationList","filter","item","name","forEach","buildSettings","PROVISIONING_PROFILE_SPECIFIER","DEVELOPMENT_TEAM","CODE_SIGN_IDENTITY","CODE_SIGN_STYLE","Object","entries","isNotComment","attributes","TargetAttributes","DevelopmentTeam","ProvisioningStyle","fs","writeFileSync","filepath","writeSync","value","match"],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAQA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AASO,SAASA,gCAAT,CACLC,WADK,EAEL;AACEC,EAAAA,UADF;AAEEC,EAAAA,WAFF;AAGEC,EAAAA,WAHF;AAIEC,EAAAA,kBAAkB,GAAG;AAJvB,CAFK,EAQC;AACN,QAAMC,OAAO,GAAG,6BAAWL,WAAX,CAAhB;AAEA,QAAMM,iBAAiB,GAAGL,UAAU,GAChC,sCAAuBI,OAAvB,EAAgCJ,UAAhC,CADgC,GAEhC,qCAAsBI,OAAtB,CAFJ;AAGA,QAAM,CAACE,cAAD,EAAiBC,YAAjB,IAAiCF,iBAAvC;AAEA,QAAMG,iBAAiB,GAAGC,YAAY,CAACP,WAAD,CAAtC;AAEA,oDAAgCE,OAAhC,EAAyCG,YAAY,CAACG,sBAAtD,EACGC,MADH,CACU,CAAC,GAAGC,IAAH,CAAD,KAAyC,0BAAWA,IAAI,CAACC,IAAhB,MAA0BV,kBAD7E,EAEGW,OAFH,CAEW,CAAC,GAAGF,IAAH,CAAD,KAAyC;AAChDA,IAAAA,IAAI,CAACG,aAAL,CAAmBC,8BAAnB,GAAqD,IAAGf,WAAY,GAApE;AACAW,IAAAA,IAAI,CAACG,aAAL,CAAmBE,gBAAnB,GAAsCT,iBAAtC;AACAI,IAAAA,IAAI,CAACG,aAAL,CAAmBG,kBAAnB,GAAwC,uBAAxC;AACAN,IAAAA,IAAI,CAACG,aAAL,CAAmBI,eAAnB,GAAqC,QAArC;AACD,GAPH;AASAC,EAAAA,MAAM,CAACC,OAAP,CAAe,oCAAkBjB,OAAlB,CAAf,EACGO,MADH,CACUW,yBADV,EAEGR,OAFH,CAEW,CAAC,GAAGF,IAAH,CAAD,KAAmC;AAC1C,QAAI,CAACA,IAAI,CAACW,UAAL,CAAgBC,gBAAhB,CAAiClB,cAAjC,CAAL,EAAuD;AACrDM,MAAAA,IAAI,CAACW,UAAL,CAAgBC,gBAAhB,CAAiClB,cAAjC,IAAmD,EAAnD;AACD;;AACDM,IAAAA,IAAI,CAACW,UAAL,CAAgBC,gBAAhB,CAAiClB,cAAjC,EAAiDmB,eAAjD,GAAmEjB,iBAAnE;AACAI,IAAAA,IAAI,CAACW,UAAL,CAAgBC,gBAAhB,CAAiClB,cAAjC,EAAiDoB,iBAAjD,GAAqE,QAArE;AACD,GARH;;AAUAC,gBAAGC,aAAH,CAAiBxB,OAAO,CAACyB,QAAzB,EAAmCzB,OAAO,CAAC0B,SAAR,EAAnC;AACD;;AAED,MAAMrB,YAAY,GAAIsB,KAAD,IAAmB;AACtC,MAAI,CAACA,KAAK,CAACC,KAAN,CAAY,OAAZ,CAAL,EAA2B;AACzB,WAAQ,IAAGD,KAAM,GAAjB;AACD;;AACD,SAAOA,KAAP;AACD,CALD","sourcesContent":["import fs from 'fs';\n\nimport { findFirstNativeTarget, findNativeTargetByName } from './Target';\nimport {\n ConfigurationSectionEntry,\n getBuildConfigurationsForListId,\n getPbxproj,\n getProjectSection,\n isNotComment,\n ProjectSectionEntry,\n} from './utils/Xcodeproj';\nimport { trimQuotes } from './utils/string';\n\ntype ProvisioningProfileSettings = {\n targetName?: string;\n appleTeamId: string;\n profileName: string;\n buildConfiguration?: string;\n};\n\nexport function setProvisioningProfileForPbxproj(\n projectRoot: string,\n {\n targetName,\n profileName,\n appleTeamId,\n buildConfiguration = 'Release',\n }: ProvisioningProfileSettings\n): void {\n const project = getPbxproj(projectRoot);\n\n const nativeTargetEntry = targetName\n ? findNativeTargetByName(project, targetName)\n : findFirstNativeTarget(project);\n const [nativeTargetId, nativeTarget] = nativeTargetEntry;\n\n const quotedAppleTeamId = ensureQuotes(appleTeamId);\n\n getBuildConfigurationsForListId(project, nativeTarget.buildConfigurationList)\n .filter(([, item]: ConfigurationSectionEntry) => trimQuotes(item.name) === buildConfiguration)\n .forEach(([, item]: ConfigurationSectionEntry) => {\n item.buildSettings.PROVISIONING_PROFILE_SPECIFIER = `\"${profileName}\"`;\n item.buildSettings.DEVELOPMENT_TEAM = quotedAppleTeamId;\n item.buildSettings.CODE_SIGN_IDENTITY = '\"iPhone Distribution\"';\n item.buildSettings.CODE_SIGN_STYLE = 'Manual';\n });\n\n Object.entries(getProjectSection(project))\n .filter(isNotComment)\n .forEach(([, item]: ProjectSectionEntry) => {\n if (!item.attributes.TargetAttributes[nativeTargetId]) {\n item.attributes.TargetAttributes[nativeTargetId] = {};\n }\n item.attributes.TargetAttributes[nativeTargetId].DevelopmentTeam = quotedAppleTeamId;\n item.attributes.TargetAttributes[nativeTargetId].ProvisioningStyle = 'Manual';\n });\n\n fs.writeFileSync(project.filepath, project.writeSync());\n}\n\nconst ensureQuotes = (value: string) => {\n if (!value.match(/^['\"]/)) {\n return `\"${value}\"`;\n }\n return value;\n};\n"],"file":"ProvisioningProfile.js"}
@@ -94,6 +94,16 @@ function Paths() {
94
94
  return data;
95
95
  }
96
96
 
97
+ function _string() {
98
+ const data = require("./string");
99
+
100
+ _string = function () {
101
+ return data;
102
+ };
103
+
104
+ return data;
105
+ }
106
+
97
107
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
98
108
 
99
109
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -442,7 +452,7 @@ function getBuildConfigurationForListIdAndName(project, {
442
452
  configurationListId,
443
453
  buildConfiguration
444
454
  }) {
445
- const xcBuildConfigurationEntry = getBuildConfigurationsForListId(project, configurationListId).find(i => i[1].name === buildConfiguration);
455
+ const xcBuildConfigurationEntry = getBuildConfigurationsForListId(project, configurationListId).find(i => (0, _string().trimQuotes)(i[1].name) === buildConfiguration);
446
456
 
447
457
  if (!xcBuildConfigurationEntry) {
448
458
  throw new Error(`Build configuration '${buildConfiguration}' does not exist in list with id '${configurationListId}'`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ios/utils/Xcodeproj.ts"],"names":["getProjectName","projectRoot","sourceRoot","Paths","getSourceRoot","path","basename","resolvePathOrProject","projectRootOrProject","getPbxproj","sanitizedName","name","sanitizedNameForProjects","replace","normalize","getHackyProjectName","config","projectName","createProjectFileForGroup","filepath","group","file","pbxFile","conflictingFile","children","find","child","comment","addResourceFileToGroup","groupName","isBuildFile","project","verbose","targetUuid","addFileToGroupAndLink","addFileToProject","addToPbxFileReferenceSection","addToPbxBuildFileSection","addToPbxResourcesBuildPhase","addBuildSourceFileToGroup","addToPbxSourcesBuildPhase","pbxGroupByPathOrAssert","target","applicationNativeTarget","getTarget","uuid","generateUuid","fileRef","push","value","getApplicationNativeTarget","String","addFramework","framework","splitPath","split","findGroup","undefined","findGroupInsideGroup","foundGroup","getPBXGroupByKey","firstProject","getFirstProject","mainGroup","components","nextGroup","Error","ensureGroupRecursively","hasChild","topMostGroup","pathComponent","pbxCreateGroup","pbxGroupByName","projectPath","getPBXProjectPath","xcode","parseSync","getProductName","productName","targetName","getFirstTarget","firstTarget","getProjectSection","pbxProjectSection","getXCConfigurationListEntries","lists","pbxXCConfigurationList","Object","entries","filter","isNotComment","getBuildConfigurationsForListId","configurationListId","configurationListEntries","configurationList","key","buildConfigurations","map","i","pbxXCBuildConfigurationSection","isBuildConfig","includes","getBuildConfigurationForListIdAndName","buildConfiguration","xcBuildConfigurationEntry","sectionItem","isa","isNotTestHost","buildSettings","TEST_HOST","endsWith","unquote","match"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport assert from 'assert';\nimport path from 'path';\nimport slugify from 'slugify';\nimport xcode, {\n PBXFile,\n PBXGroup,\n PBXNativeTarget,\n PBXProject,\n UUID,\n XCBuildConfiguration,\n XCConfigurationList,\n XcodeProject,\n} from 'xcode';\nimport pbxFile from 'xcode/lib/pbxFile';\n\nimport { addWarningIOS } from '../../utils/warnings';\nimport * as Paths from '../Paths';\n\nexport type ProjectSectionEntry = [string, PBXProject];\n\nexport type NativeTargetSection = Record<string, PBXNativeTarget>;\n\nexport type NativeTargetSectionEntry = [string, PBXNativeTarget];\n\nexport type ConfigurationLists = Record<string, XCConfigurationList>;\n\nexport type ConfigurationListEntry = [string, XCConfigurationList];\n\nexport type ConfigurationSectionEntry = [string, XCBuildConfiguration];\n\nexport function getProjectName(projectRoot: string) {\n const sourceRoot = Paths.getSourceRoot(projectRoot);\n return path.basename(sourceRoot);\n}\n\nexport function resolvePathOrProject(\n projectRootOrProject: string | XcodeProject\n): XcodeProject | null {\n if (typeof projectRootOrProject === 'string') {\n try {\n return getPbxproj(projectRootOrProject);\n } catch {\n return null;\n }\n }\n return projectRootOrProject;\n}\n\n// TODO: come up with a better solution for using app.json expo.name in various places\nexport function sanitizedName(name: string) {\n // Default to the name `app` when every safe character has been sanitized\n return sanitizedNameForProjects(name) || sanitizedNameForProjects(slugify(name)) || 'app';\n}\n\nfunction sanitizedNameForProjects(name: string) {\n return name\n .replace(/[\\W_]+/g, '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '');\n}\n\n// TODO: it's silly and kind of fragile that we look at app config to determine\n// the ios project paths. Overall this function needs to be revamped, just a\n// placeholder for now! Make this more robust when we support applying config\n// at any time (currently it's only applied on eject).\nexport function getHackyProjectName(projectRoot: string, config: ExpoConfig): string {\n // Attempt to get the current ios folder name (apply).\n try {\n return getProjectName(projectRoot);\n } catch {\n // If no iOS project exists then create a new one (eject).\n const projectName = config.name;\n assert(projectName, 'Your project needs a name in app.json/app.config.js.');\n return sanitizedName(projectName);\n }\n}\n\nfunction createProjectFileForGroup({ filepath, group }: { filepath: string; group: PBXGroup }) {\n const file = new pbxFile(filepath);\n\n const conflictingFile = group.children.find(child => child.comment === file.basename);\n if (conflictingFile) {\n // This can happen when a file like the GoogleService-Info.plist needs to be added and the eject command is run twice.\n // Not much we can do here since it might be a conflicting file.\n return null;\n }\n return file;\n}\n\n/**\n * Add a resource file (ex: `SplashScreen.storyboard`, `Images.xcassets`) to an Xcode project.\n * This is akin to creating a new code file in Xcode with `⌘+n`.\n */\nexport function addResourceFileToGroup({\n filepath,\n groupName,\n // Should add to `PBXBuildFile Section`\n isBuildFile,\n project,\n verbose,\n targetUuid,\n}: {\n filepath: string;\n groupName: string;\n isBuildFile?: boolean;\n project: XcodeProject;\n verbose?: boolean;\n targetUuid?: string;\n}): XcodeProject {\n return addFileToGroupAndLink({\n filepath,\n groupName,\n project,\n verbose,\n targetUuid,\n addFileToProject({ project, file }) {\n project.addToPbxFileReferenceSection(file);\n if (isBuildFile) {\n project.addToPbxBuildFileSection(file);\n }\n project.addToPbxResourcesBuildPhase(file);\n },\n });\n}\n\n/**\n * Add a build source file (ex: `AppDelegate.m`, `ViewController.swift`) to an Xcode project.\n * This is akin to creating a new code file in Xcode with `⌘+n`.\n */\nexport function addBuildSourceFileToGroup({\n filepath,\n groupName,\n project,\n verbose,\n targetUuid,\n}: {\n filepath: string;\n groupName: string;\n project: XcodeProject;\n verbose?: boolean;\n targetUuid?: string;\n}): XcodeProject {\n return addFileToGroupAndLink({\n filepath,\n groupName,\n project,\n verbose,\n targetUuid,\n addFileToProject({ project, file }) {\n project.addToPbxFileReferenceSection(file);\n project.addToPbxBuildFileSection(file);\n project.addToPbxSourcesBuildPhase(file);\n },\n });\n}\n\n// TODO(brentvatne): I couldn't figure out how to do this with an existing\n// higher level function exposed by the xcode library, but we should find out how to do\n// that and replace this with it\nexport function addFileToGroupAndLink({\n filepath,\n groupName,\n project,\n verbose,\n addFileToProject,\n targetUuid,\n}: {\n filepath: string;\n groupName: string;\n project: XcodeProject;\n verbose?: boolean;\n targetUuid?: string;\n addFileToProject: (props: { file: PBXFile; project: XcodeProject }) => void;\n}): XcodeProject {\n const group = pbxGroupByPathOrAssert(project, groupName);\n\n const file = createProjectFileForGroup({ filepath, group });\n\n if (!file) {\n if (verbose) {\n // This can happen when a file like the GoogleService-Info.plist needs to be added and the eject command is run twice.\n // Not much we can do here since it might be a conflicting file.\n addWarningIOS(\n 'ios-xcode-project',\n `Skipped adding duplicate file \"${filepath}\" to PBXGroup named \"${groupName}\"`\n );\n }\n return project;\n }\n\n if (targetUuid != null) {\n file.target = targetUuid;\n } else {\n const applicationNativeTarget = project.getTarget('com.apple.product-type.application');\n file.target = applicationNativeTarget?.uuid;\n }\n\n file.uuid = project.generateUuid();\n file.fileRef = project.generateUuid();\n\n addFileToProject({ project, file });\n\n group.children.push({\n value: file.fileRef,\n comment: file.basename,\n });\n return project;\n}\n\nexport function getApplicationNativeTarget({\n project,\n projectName,\n}: {\n project: XcodeProject;\n projectName: string;\n}) {\n const applicationNativeTarget = project.getTarget('com.apple.product-type.application');\n assert(\n applicationNativeTarget,\n `Couldn't locate application PBXNativeTarget in '.xcodeproj' file.`\n );\n assert(\n String(applicationNativeTarget.target.name) === projectName,\n `Application native target name mismatch. Expected ${projectName}, but found ${applicationNativeTarget.target.name}.`\n );\n return applicationNativeTarget;\n}\n\n/**\n * Add a framework to the default app native target.\n *\n * @param projectName Name of the PBX project.\n * @param framework String ending in `.framework`, i.e. `StoreKit.framework`\n */\nexport function addFramework({\n project,\n projectName,\n framework,\n}: {\n project: XcodeProject;\n projectName: string;\n framework: string;\n}) {\n const target = getApplicationNativeTarget({ project, projectName });\n return project.addFramework(framework, { target: target.uuid });\n}\n\nfunction splitPath(path: string): string[] {\n // TODO: Should we account for other platforms that may not use `/`\n return path.split('/');\n}\n\nconst findGroup = (\n group: PBXGroup | undefined,\n name: string\n):\n | {\n value: UUID;\n comment?: string;\n }\n | undefined => {\n if (!group) {\n return undefined;\n }\n\n return group.children.find(group => group.comment === name);\n};\n\nfunction findGroupInsideGroup(\n project: XcodeProject,\n group: PBXGroup | undefined,\n name: string\n): null | PBXGroup {\n const foundGroup = findGroup(group, name);\n if (foundGroup) {\n return project.getPBXGroupByKey(foundGroup.value) ?? null;\n }\n return null;\n}\n\nfunction pbxGroupByPathOrAssert(project: XcodeProject, path: string): PBXGroup {\n const { firstProject } = project.getFirstProject();\n\n let group = project.getPBXGroupByKey(firstProject.mainGroup);\n\n const components = splitPath(path);\n for (const name of components) {\n const nextGroup = findGroupInsideGroup(project, group, name);\n if (nextGroup) {\n group = nextGroup;\n } else {\n break;\n }\n }\n\n if (!group) {\n throw Error(`Xcode PBXGroup with name \"${path}\" could not be found in the Xcode project.`);\n }\n\n return group;\n}\n\nexport function ensureGroupRecursively(project: XcodeProject, filepath: string): PBXGroup | null {\n const components = splitPath(filepath);\n const hasChild = (group: PBXGroup, name: string) =>\n group.children.find(({ comment }) => comment === name);\n const { firstProject } = project.getFirstProject();\n\n let topMostGroup = project.getPBXGroupByKey(firstProject.mainGroup);\n\n for (const pathComponent of components) {\n if (topMostGroup && !hasChild(topMostGroup, pathComponent)) {\n topMostGroup.children.push({\n comment: pathComponent,\n value: project.pbxCreateGroup(pathComponent, '\"\"'),\n });\n }\n topMostGroup = project.pbxGroupByName(pathComponent);\n }\n return topMostGroup ?? null;\n}\n\n/**\n * Get the pbxproj for the given path\n */\nexport function getPbxproj(projectRoot: string): XcodeProject {\n const projectPath = Paths.getPBXProjectPath(projectRoot);\n const project = xcode.project(projectPath);\n project.parseSync();\n return project;\n}\n\n/**\n * Get the productName for a project, if the name is using a variable `$(TARGET_NAME)`, then attempt to get the value of that variable.\n *\n * @param project\n */\nexport function getProductName(project: XcodeProject): string {\n let productName = '$(TARGET_NAME)';\n try {\n // If the product name is numeric, this will fail (it's a getter).\n // If the bundle identifier' final component is only numeric values, then the PRODUCT_NAME\n // will be a numeric value, this results in a bug where the product name isn't useful,\n // i.e. `com.bacon.001` -> `1` -- in this case, use the first target name.\n productName = project.productName;\n } catch {}\n\n if (productName === '$(TARGET_NAME)') {\n const targetName = project.getFirstTarget()?.firstTarget?.productName;\n productName = targetName ?? productName;\n }\n\n return productName;\n}\n\nexport function getProjectSection(project: XcodeProject) {\n return project.pbxProjectSection();\n}\n\nexport function getXCConfigurationListEntries(project: XcodeProject): ConfigurationListEntry[] {\n const lists = project.pbxXCConfigurationList();\n return Object.entries(lists).filter(isNotComment);\n}\n\nexport function getBuildConfigurationsForListId(\n project: XcodeProject,\n configurationListId: string\n): ConfigurationSectionEntry[] {\n const configurationListEntries = getXCConfigurationListEntries(project);\n const [, configurationList] = configurationListEntries.find(\n ([key]) => key === configurationListId\n ) as ConfigurationListEntry;\n\n const buildConfigurations = configurationList.buildConfigurations.map(i => i.value);\n\n return Object.entries(project.pbxXCBuildConfigurationSection())\n .filter(isNotComment)\n .filter(isBuildConfig)\n .filter(([key]: ConfigurationSectionEntry) => buildConfigurations.includes(key));\n}\n\nexport function getBuildConfigurationForListIdAndName(\n project: XcodeProject,\n {\n configurationListId,\n buildConfiguration,\n }: { configurationListId: string; buildConfiguration: string }\n): ConfigurationSectionEntry {\n const xcBuildConfigurationEntry = getBuildConfigurationsForListId(\n project,\n configurationListId\n ).find(i => i[1].name === buildConfiguration);\n if (!xcBuildConfigurationEntry) {\n throw new Error(\n `Build configuration '${buildConfiguration}' does not exist in list with id '${configurationListId}'`\n );\n }\n return xcBuildConfigurationEntry;\n}\n\nexport function isBuildConfig([, sectionItem]: ConfigurationSectionEntry): boolean {\n return sectionItem.isa === 'XCBuildConfiguration';\n}\n\nexport function isNotTestHost([, sectionItem]: ConfigurationSectionEntry): boolean {\n return !sectionItem.buildSettings.TEST_HOST;\n}\n\nexport function isNotComment([key]:\n | ConfigurationSectionEntry\n | ProjectSectionEntry\n | ConfigurationListEntry\n | NativeTargetSectionEntry): boolean {\n return !key.endsWith(`_comment`);\n}\n\n// Remove surrounding double quotes if they exist.\nexport function unquote(value: string): string {\n // projects with numeric names will fail due to a bug in the xcode package.\n if (typeof value === 'number') {\n value = String(value);\n }\n return value.match(/^\"(.*)\"$/)?.[1] ?? value;\n}\n"],"file":"Xcodeproj.js"}
1
+ {"version":3,"sources":["../../../src/ios/utils/Xcodeproj.ts"],"names":["getProjectName","projectRoot","sourceRoot","Paths","getSourceRoot","path","basename","resolvePathOrProject","projectRootOrProject","getPbxproj","sanitizedName","name","sanitizedNameForProjects","replace","normalize","getHackyProjectName","config","projectName","createProjectFileForGroup","filepath","group","file","pbxFile","conflictingFile","children","find","child","comment","addResourceFileToGroup","groupName","isBuildFile","project","verbose","targetUuid","addFileToGroupAndLink","addFileToProject","addToPbxFileReferenceSection","addToPbxBuildFileSection","addToPbxResourcesBuildPhase","addBuildSourceFileToGroup","addToPbxSourcesBuildPhase","pbxGroupByPathOrAssert","target","applicationNativeTarget","getTarget","uuid","generateUuid","fileRef","push","value","getApplicationNativeTarget","String","addFramework","framework","splitPath","split","findGroup","undefined","findGroupInsideGroup","foundGroup","getPBXGroupByKey","firstProject","getFirstProject","mainGroup","components","nextGroup","Error","ensureGroupRecursively","hasChild","topMostGroup","pathComponent","pbxCreateGroup","pbxGroupByName","projectPath","getPBXProjectPath","xcode","parseSync","getProductName","productName","targetName","getFirstTarget","firstTarget","getProjectSection","pbxProjectSection","getXCConfigurationListEntries","lists","pbxXCConfigurationList","Object","entries","filter","isNotComment","getBuildConfigurationsForListId","configurationListId","configurationListEntries","configurationList","key","buildConfigurations","map","i","pbxXCBuildConfigurationSection","isBuildConfig","includes","getBuildConfigurationForListIdAndName","buildConfiguration","xcBuildConfigurationEntry","sectionItem","isa","isNotTestHost","buildSettings","TEST_HOST","endsWith","unquote","match"],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport assert from 'assert';\nimport path from 'path';\nimport slugify from 'slugify';\nimport xcode, {\n PBXFile,\n PBXGroup,\n PBXNativeTarget,\n PBXProject,\n UUID,\n XCBuildConfiguration,\n XCConfigurationList,\n XcodeProject,\n} from 'xcode';\nimport pbxFile from 'xcode/lib/pbxFile';\n\nimport { addWarningIOS } from '../../utils/warnings';\nimport * as Paths from '../Paths';\nimport { trimQuotes } from './string';\n\nexport type ProjectSectionEntry = [string, PBXProject];\n\nexport type NativeTargetSection = Record<string, PBXNativeTarget>;\n\nexport type NativeTargetSectionEntry = [string, PBXNativeTarget];\n\nexport type ConfigurationLists = Record<string, XCConfigurationList>;\n\nexport type ConfigurationListEntry = [string, XCConfigurationList];\n\nexport type ConfigurationSectionEntry = [string, XCBuildConfiguration];\n\nexport function getProjectName(projectRoot: string) {\n const sourceRoot = Paths.getSourceRoot(projectRoot);\n return path.basename(sourceRoot);\n}\n\nexport function resolvePathOrProject(\n projectRootOrProject: string | XcodeProject\n): XcodeProject | null {\n if (typeof projectRootOrProject === 'string') {\n try {\n return getPbxproj(projectRootOrProject);\n } catch {\n return null;\n }\n }\n return projectRootOrProject;\n}\n\n// TODO: come up with a better solution for using app.json expo.name in various places\nexport function sanitizedName(name: string) {\n // Default to the name `app` when every safe character has been sanitized\n return sanitizedNameForProjects(name) || sanitizedNameForProjects(slugify(name)) || 'app';\n}\n\nfunction sanitizedNameForProjects(name: string) {\n return name\n .replace(/[\\W_]+/g, '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '');\n}\n\n// TODO: it's silly and kind of fragile that we look at app config to determine\n// the ios project paths. Overall this function needs to be revamped, just a\n// placeholder for now! Make this more robust when we support applying config\n// at any time (currently it's only applied on eject).\nexport function getHackyProjectName(projectRoot: string, config: ExpoConfig): string {\n // Attempt to get the current ios folder name (apply).\n try {\n return getProjectName(projectRoot);\n } catch {\n // If no iOS project exists then create a new one (eject).\n const projectName = config.name;\n assert(projectName, 'Your project needs a name in app.json/app.config.js.');\n return sanitizedName(projectName);\n }\n}\n\nfunction createProjectFileForGroup({ filepath, group }: { filepath: string; group: PBXGroup }) {\n const file = new pbxFile(filepath);\n\n const conflictingFile = group.children.find(child => child.comment === file.basename);\n if (conflictingFile) {\n // This can happen when a file like the GoogleService-Info.plist needs to be added and the eject command is run twice.\n // Not much we can do here since it might be a conflicting file.\n return null;\n }\n return file;\n}\n\n/**\n * Add a resource file (ex: `SplashScreen.storyboard`, `Images.xcassets`) to an Xcode project.\n * This is akin to creating a new code file in Xcode with `⌘+n`.\n */\nexport function addResourceFileToGroup({\n filepath,\n groupName,\n // Should add to `PBXBuildFile Section`\n isBuildFile,\n project,\n verbose,\n targetUuid,\n}: {\n filepath: string;\n groupName: string;\n isBuildFile?: boolean;\n project: XcodeProject;\n verbose?: boolean;\n targetUuid?: string;\n}): XcodeProject {\n return addFileToGroupAndLink({\n filepath,\n groupName,\n project,\n verbose,\n targetUuid,\n addFileToProject({ project, file }) {\n project.addToPbxFileReferenceSection(file);\n if (isBuildFile) {\n project.addToPbxBuildFileSection(file);\n }\n project.addToPbxResourcesBuildPhase(file);\n },\n });\n}\n\n/**\n * Add a build source file (ex: `AppDelegate.m`, `ViewController.swift`) to an Xcode project.\n * This is akin to creating a new code file in Xcode with `⌘+n`.\n */\nexport function addBuildSourceFileToGroup({\n filepath,\n groupName,\n project,\n verbose,\n targetUuid,\n}: {\n filepath: string;\n groupName: string;\n project: XcodeProject;\n verbose?: boolean;\n targetUuid?: string;\n}): XcodeProject {\n return addFileToGroupAndLink({\n filepath,\n groupName,\n project,\n verbose,\n targetUuid,\n addFileToProject({ project, file }) {\n project.addToPbxFileReferenceSection(file);\n project.addToPbxBuildFileSection(file);\n project.addToPbxSourcesBuildPhase(file);\n },\n });\n}\n\n// TODO(brentvatne): I couldn't figure out how to do this with an existing\n// higher level function exposed by the xcode library, but we should find out how to do\n// that and replace this with it\nexport function addFileToGroupAndLink({\n filepath,\n groupName,\n project,\n verbose,\n addFileToProject,\n targetUuid,\n}: {\n filepath: string;\n groupName: string;\n project: XcodeProject;\n verbose?: boolean;\n targetUuid?: string;\n addFileToProject: (props: { file: PBXFile; project: XcodeProject }) => void;\n}): XcodeProject {\n const group = pbxGroupByPathOrAssert(project, groupName);\n\n const file = createProjectFileForGroup({ filepath, group });\n\n if (!file) {\n if (verbose) {\n // This can happen when a file like the GoogleService-Info.plist needs to be added and the eject command is run twice.\n // Not much we can do here since it might be a conflicting file.\n addWarningIOS(\n 'ios-xcode-project',\n `Skipped adding duplicate file \"${filepath}\" to PBXGroup named \"${groupName}\"`\n );\n }\n return project;\n }\n\n if (targetUuid != null) {\n file.target = targetUuid;\n } else {\n const applicationNativeTarget = project.getTarget('com.apple.product-type.application');\n file.target = applicationNativeTarget?.uuid;\n }\n\n file.uuid = project.generateUuid();\n file.fileRef = project.generateUuid();\n\n addFileToProject({ project, file });\n\n group.children.push({\n value: file.fileRef,\n comment: file.basename,\n });\n return project;\n}\n\nexport function getApplicationNativeTarget({\n project,\n projectName,\n}: {\n project: XcodeProject;\n projectName: string;\n}) {\n const applicationNativeTarget = project.getTarget('com.apple.product-type.application');\n assert(\n applicationNativeTarget,\n `Couldn't locate application PBXNativeTarget in '.xcodeproj' file.`\n );\n assert(\n String(applicationNativeTarget.target.name) === projectName,\n `Application native target name mismatch. Expected ${projectName}, but found ${applicationNativeTarget.target.name}.`\n );\n return applicationNativeTarget;\n}\n\n/**\n * Add a framework to the default app native target.\n *\n * @param projectName Name of the PBX project.\n * @param framework String ending in `.framework`, i.e. `StoreKit.framework`\n */\nexport function addFramework({\n project,\n projectName,\n framework,\n}: {\n project: XcodeProject;\n projectName: string;\n framework: string;\n}) {\n const target = getApplicationNativeTarget({ project, projectName });\n return project.addFramework(framework, { target: target.uuid });\n}\n\nfunction splitPath(path: string): string[] {\n // TODO: Should we account for other platforms that may not use `/`\n return path.split('/');\n}\n\nconst findGroup = (\n group: PBXGroup | undefined,\n name: string\n):\n | {\n value: UUID;\n comment?: string;\n }\n | undefined => {\n if (!group) {\n return undefined;\n }\n\n return group.children.find(group => group.comment === name);\n};\n\nfunction findGroupInsideGroup(\n project: XcodeProject,\n group: PBXGroup | undefined,\n name: string\n): null | PBXGroup {\n const foundGroup = findGroup(group, name);\n if (foundGroup) {\n return project.getPBXGroupByKey(foundGroup.value) ?? null;\n }\n return null;\n}\n\nfunction pbxGroupByPathOrAssert(project: XcodeProject, path: string): PBXGroup {\n const { firstProject } = project.getFirstProject();\n\n let group = project.getPBXGroupByKey(firstProject.mainGroup);\n\n const components = splitPath(path);\n for (const name of components) {\n const nextGroup = findGroupInsideGroup(project, group, name);\n if (nextGroup) {\n group = nextGroup;\n } else {\n break;\n }\n }\n\n if (!group) {\n throw Error(`Xcode PBXGroup with name \"${path}\" could not be found in the Xcode project.`);\n }\n\n return group;\n}\n\nexport function ensureGroupRecursively(project: XcodeProject, filepath: string): PBXGroup | null {\n const components = splitPath(filepath);\n const hasChild = (group: PBXGroup, name: string) =>\n group.children.find(({ comment }) => comment === name);\n const { firstProject } = project.getFirstProject();\n\n let topMostGroup = project.getPBXGroupByKey(firstProject.mainGroup);\n\n for (const pathComponent of components) {\n if (topMostGroup && !hasChild(topMostGroup, pathComponent)) {\n topMostGroup.children.push({\n comment: pathComponent,\n value: project.pbxCreateGroup(pathComponent, '\"\"'),\n });\n }\n topMostGroup = project.pbxGroupByName(pathComponent);\n }\n return topMostGroup ?? null;\n}\n\n/**\n * Get the pbxproj for the given path\n */\nexport function getPbxproj(projectRoot: string): XcodeProject {\n const projectPath = Paths.getPBXProjectPath(projectRoot);\n const project = xcode.project(projectPath);\n project.parseSync();\n return project;\n}\n\n/**\n * Get the productName for a project, if the name is using a variable `$(TARGET_NAME)`, then attempt to get the value of that variable.\n *\n * @param project\n */\nexport function getProductName(project: XcodeProject): string {\n let productName = '$(TARGET_NAME)';\n try {\n // If the product name is numeric, this will fail (it's a getter).\n // If the bundle identifier' final component is only numeric values, then the PRODUCT_NAME\n // will be a numeric value, this results in a bug where the product name isn't useful,\n // i.e. `com.bacon.001` -> `1` -- in this case, use the first target name.\n productName = project.productName;\n } catch {}\n\n if (productName === '$(TARGET_NAME)') {\n const targetName = project.getFirstTarget()?.firstTarget?.productName;\n productName = targetName ?? productName;\n }\n\n return productName;\n}\n\nexport function getProjectSection(project: XcodeProject) {\n return project.pbxProjectSection();\n}\n\nexport function getXCConfigurationListEntries(project: XcodeProject): ConfigurationListEntry[] {\n const lists = project.pbxXCConfigurationList();\n return Object.entries(lists).filter(isNotComment);\n}\n\nexport function getBuildConfigurationsForListId(\n project: XcodeProject,\n configurationListId: string\n): ConfigurationSectionEntry[] {\n const configurationListEntries = getXCConfigurationListEntries(project);\n const [, configurationList] = configurationListEntries.find(\n ([key]) => key === configurationListId\n ) as ConfigurationListEntry;\n\n const buildConfigurations = configurationList.buildConfigurations.map(i => i.value);\n\n return Object.entries(project.pbxXCBuildConfigurationSection())\n .filter(isNotComment)\n .filter(isBuildConfig)\n .filter(([key]: ConfigurationSectionEntry) => buildConfigurations.includes(key));\n}\n\nexport function getBuildConfigurationForListIdAndName(\n project: XcodeProject,\n {\n configurationListId,\n buildConfiguration,\n }: { configurationListId: string; buildConfiguration: string }\n): ConfigurationSectionEntry {\n const xcBuildConfigurationEntry = getBuildConfigurationsForListId(\n project,\n configurationListId\n ).find(i => trimQuotes(i[1].name) === buildConfiguration);\n if (!xcBuildConfigurationEntry) {\n throw new Error(\n `Build configuration '${buildConfiguration}' does not exist in list with id '${configurationListId}'`\n );\n }\n return xcBuildConfigurationEntry;\n}\n\nexport function isBuildConfig([, sectionItem]: ConfigurationSectionEntry): boolean {\n return sectionItem.isa === 'XCBuildConfiguration';\n}\n\nexport function isNotTestHost([, sectionItem]: ConfigurationSectionEntry): boolean {\n return !sectionItem.buildSettings.TEST_HOST;\n}\n\nexport function isNotComment([key]:\n | ConfigurationSectionEntry\n | ProjectSectionEntry\n | ConfigurationListEntry\n | NativeTargetSectionEntry): boolean {\n return !key.endsWith(`_comment`);\n}\n\n// Remove surrounding double quotes if they exist.\nexport function unquote(value: string): string {\n // projects with numeric names will fail due to a bug in the xcode package.\n if (typeof value === 'number') {\n value = String(value);\n }\n return value.match(/^\"(.*)\"$/)?.[1] ?? value;\n}\n"],"file":"Xcodeproj.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/config-plugins",
3
- "version": "4.1.4",
3
+ "version": "4.1.5",
4
4
  "description": "A library for Expo config plugins",
5
5
  "main": "build/index.js",
6
6
  "scripts": {