1082815dcSEvan Baconimport Debug from 'debug'; 2082815dcSEvan Bacon 3*8a424bebSJames Ideimport { InfoPlist } from './IosConfig.types'; 4082815dcSEvan Baconimport { ConfigPlugin } from '../Plugin.types'; 5082815dcSEvan Baconimport { withInfoPlist } from '../plugins/ios-plugins'; 6082815dcSEvan Bacon 7082815dcSEvan Baconconst debug = Debug('expo:config-plugins:ios:permissions'); 8082815dcSEvan Bacon 9082815dcSEvan Baconexport function applyPermissions<Defaults extends Record<string, string> = Record<string, string>>( 10082815dcSEvan Bacon defaults: Defaults, 11082815dcSEvan Bacon permissions: Partial<Record<keyof Defaults, string | false>>, 12082815dcSEvan Bacon infoPlist: InfoPlist 13082815dcSEvan Bacon): InfoPlist { 14082815dcSEvan Bacon const entries = Object.entries(defaults); 15082815dcSEvan Bacon if (entries.length === 0) { 16082815dcSEvan Bacon debug(`No defaults provided: ${JSON.stringify(permissions)}`); 17082815dcSEvan Bacon } 18082815dcSEvan Bacon for (const [permission, description] of entries) { 19082815dcSEvan Bacon if (permissions[permission] === false) { 20082815dcSEvan Bacon debug(`Deleting "${permission}"`); 21082815dcSEvan Bacon delete infoPlist[permission]; 22082815dcSEvan Bacon } else { 23082815dcSEvan Bacon infoPlist[permission] = permissions[permission] || infoPlist[permission] || description; 24082815dcSEvan Bacon debug(`Setting "${permission}" to "${infoPlist[permission]}"`); 25082815dcSEvan Bacon } 26082815dcSEvan Bacon } 27082815dcSEvan Bacon return infoPlist; 28082815dcSEvan Bacon} 29082815dcSEvan Bacon 30082815dcSEvan Bacon/** 31082815dcSEvan Bacon * Helper method for creating mods to apply default permissions. 32082815dcSEvan Bacon * 33082815dcSEvan Bacon * @param action 34082815dcSEvan Bacon */ 35082815dcSEvan Baconexport function createPermissionsPlugin< 36*8a424bebSJames Ide Defaults extends Record<string, string> = Record<string, string>, 37082815dcSEvan Bacon>(defaults: Defaults, name?: string) { 38082815dcSEvan Bacon const withIosPermissions: ConfigPlugin<Record<keyof Defaults, string | undefined | false>> = ( 39082815dcSEvan Bacon config, 40082815dcSEvan Bacon permissions 41082815dcSEvan Bacon ) => 42082815dcSEvan Bacon withInfoPlist(config, async (config) => { 43082815dcSEvan Bacon config.modResults = applyPermissions(defaults, permissions, config.modResults); 44082815dcSEvan Bacon return config; 45082815dcSEvan Bacon }); 46082815dcSEvan Bacon if (name) { 47082815dcSEvan Bacon Object.defineProperty(withIosPermissions, 'name', { 48082815dcSEvan Bacon value: name, 49082815dcSEvan Bacon }); 50082815dcSEvan Bacon } 51082815dcSEvan Bacon return withIosPermissions; 52082815dcSEvan Bacon} 53