1*6020c730SEvan Baconimport { IOSConfig } from '@expo/config-plugins';
2*6020c730SEvan Baconimport plist from '@expo/plist';
3*6020c730SEvan Baconimport fs from 'fs';
4*6020c730SEvan Bacon
5*6020c730SEvan Baconconst debug = require('debug')('expo:run:ios:codeSigning:simulator');
6*6020c730SEvan Bacon
7*6020c730SEvan Bacon// NOTE(EvanBacon): These are entitlements that work in a simulator
8*6020c730SEvan Bacon// but still require the project to have development code signing setup.
9*6020c730SEvan Bacon// There may be more, but this is fine for now.
10*6020c730SEvan Baconconst ENTITLEMENTS_THAT_REQUIRE_CODE_SIGNING = [
11*6020c730SEvan Bacon  'com.apple.developer.associated-domains',
12*6020c730SEvan Bacon  'com.apple.developer.applesignin',
13*6020c730SEvan Bacon];
14*6020c730SEvan Bacon
15*6020c730SEvan Baconfunction getEntitlements(projectRoot: string): Record<string, any> | null {
16*6020c730SEvan Bacon  try {
17*6020c730SEvan Bacon    const entitlementsPath = IOSConfig.Entitlements.getEntitlementsPath(projectRoot);
18*6020c730SEvan Bacon    if (!entitlementsPath || !fs.existsSync(entitlementsPath)) {
19*6020c730SEvan Bacon      return null;
20*6020c730SEvan Bacon    }
21*6020c730SEvan Bacon
22*6020c730SEvan Bacon    const entitlementsContents = fs.readFileSync(entitlementsPath, 'utf8');
23*6020c730SEvan Bacon    const entitlements = plist.parse(entitlementsContents);
24*6020c730SEvan Bacon    return entitlements;
25*6020c730SEvan Bacon  } catch (error) {
26*6020c730SEvan Bacon    debug('Failed to read entitlements', error);
27*6020c730SEvan Bacon  }
28*6020c730SEvan Bacon  return null;
29*6020c730SEvan Bacon}
30*6020c730SEvan Bacon
31*6020c730SEvan Bacon/** @returns true if the simulator build should be code signed for development. */
32*6020c730SEvan Baconexport function simulatorBuildRequiresCodeSigning(projectRoot: string): boolean {
33*6020c730SEvan Bacon  const entitlements = getEntitlements(projectRoot);
34*6020c730SEvan Bacon  if (!entitlements) {
35*6020c730SEvan Bacon    return false;
36*6020c730SEvan Bacon  }
37*6020c730SEvan Bacon  return ENTITLEMENTS_THAT_REQUIRE_CODE_SIGNING.some((entitlement) => entitlement in entitlements);
38*6020c730SEvan Bacon}
39