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