1import { getConfig } from '@expo/config';
2import { ModPlatform } from '@expo/config-plugins';
3
4import { getAutolinkedPackagesAsync } from './getAutolinkedPackages';
5import {
6  withAndroidExpoPlugins,
7  withIosExpoPlugins,
8  withLegacyExpoPlugins,
9  withVersionedExpoSDKPlugins,
10} from './plugins/withDefaultPlugins';
11
12export async function getPrebuildConfigAsync(
13  projectRoot: string,
14  props: {
15    bundleIdentifier?: string;
16    packageName?: string;
17    platforms: ModPlatform[];
18  }
19): Promise<ReturnType<typeof getConfig>> {
20  const autolinkedModules = await getAutolinkedPackagesAsync(projectRoot, props.platforms);
21
22  return getPrebuildConfig(projectRoot, {
23    ...props,
24    autolinkedModules,
25  });
26}
27
28function getPrebuildConfig(
29  projectRoot: string,
30  {
31    platforms,
32    bundleIdentifier,
33    packageName,
34    autolinkedModules,
35  }: {
36    bundleIdentifier?: string;
37    packageName?: string;
38    platforms: ModPlatform[];
39    autolinkedModules?: string[];
40  }
41) {
42  // let config: ExpoConfig;
43  let { exp: config, ...rest } = getConfig(projectRoot, {
44    skipSDKVersionRequirement: true,
45    isModdedConfig: true,
46  });
47
48  if (autolinkedModules) {
49    if (!config._internal) {
50      config._internal = {};
51    }
52    config._internal.autolinkedModules = autolinkedModules;
53  }
54
55  // Add all built-in plugins first because they should take
56  // priority over the unversioned plugins.
57  config = withVersionedExpoSDKPlugins(config);
58  config = withLegacyExpoPlugins(config);
59
60  if (platforms.includes('ios')) {
61    if (!config.ios) config.ios = {};
62    config.ios.bundleIdentifier =
63      bundleIdentifier ?? config.ios.bundleIdentifier ?? `com.placeholder.appid`;
64
65    // Add all built-in plugins
66    config = withIosExpoPlugins(config, {
67      bundleIdentifier: config.ios.bundleIdentifier,
68    });
69  }
70
71  if (platforms.includes('android')) {
72    if (!config.android) config.android = {};
73    config.android.package = packageName ?? config.android.package ?? `com.placeholder.appid`;
74
75    // Add all built-in plugins
76    config = withAndroidExpoPlugins(config, {
77      package: config.android.package,
78    });
79  }
80
81  return { exp: config, ...rest };
82}
83