1dc51e206SEvan Baconimport { getConfig, Platform, ProjectTarget } from '@expo/config';
2dc51e206SEvan Bacon
3*8a424bebSJames Ideimport { bundleAsync, BundleOutput } from './fork-bundleAsync';
40a6ddb20SEvan Baconimport { getEntryWithServerRoot } from '../start/server/middleware/ManifestMiddleware';
5dc51e206SEvan Bacon
6dc51e206SEvan Baconexport type PublishOptions = {
7dc51e206SEvan Bacon  releaseChannel?: string;
8dc51e206SEvan Bacon  target?: ProjectTarget;
9dc51e206SEvan Bacon  resetCache?: boolean;
10dc51e206SEvan Bacon  maxWorkers?: number;
11dc51e206SEvan Bacon};
12dc51e206SEvan Bacon
13dc51e206SEvan Bacon// TODO: Reduce layers of indirection
14dc51e206SEvan Baconexport async function createBundlesAsync(
15dc51e206SEvan Bacon  projectRoot: string,
16dc51e206SEvan Bacon  publishOptions: PublishOptions = {},
171a3d836eSEvan Bacon  bundleOptions: { platforms: Platform[]; dev?: boolean; minify?: boolean }
18dc51e206SEvan Bacon): Promise<Partial<Record<Platform, BundleOutput>>> {
199580591fSEvan Bacon  if (!bundleOptions.platforms.length) {
209580591fSEvan Bacon    return {};
219580591fSEvan Bacon  }
220a6ddb20SEvan Bacon  const projectConfig = getConfig(projectRoot, { skipSDKVersionRequirement: true });
230a6ddb20SEvan Bacon  const { exp } = projectConfig;
24dc51e206SEvan Bacon
25dc51e206SEvan Bacon  const bundles = await bundleAsync(
26dc51e206SEvan Bacon    projectRoot,
27dc51e206SEvan Bacon    exp,
28dc51e206SEvan Bacon    {
29dc51e206SEvan Bacon      // If not legacy, ignore the target option to prevent warnings from being thrown.
30dc51e206SEvan Bacon      resetCache: publishOptions.resetCache,
31dc51e206SEvan Bacon      maxWorkers: publishOptions.maxWorkers,
32dc51e206SEvan Bacon      quiet: false,
33dc51e206SEvan Bacon    },
34dc51e206SEvan Bacon    bundleOptions.platforms.map((platform: Platform) => ({
35dc51e206SEvan Bacon      platform,
360a6ddb20SEvan Bacon      entryPoint: getEntryWithServerRoot(projectRoot, projectConfig, platform),
371a3d836eSEvan Bacon      minify: bundleOptions.minify,
38dc51e206SEvan Bacon      dev: bundleOptions.dev,
39dc51e206SEvan Bacon    }))
40dc51e206SEvan Bacon  );
41dc51e206SEvan Bacon
42dc51e206SEvan Bacon  // { ios: bundle, android: bundle }
43dc51e206SEvan Bacon  return bundleOptions.platforms.reduce<Partial<Record<Platform, BundleOutput>>>(
44dc51e206SEvan Bacon    (prev, platform, index) => ({
45dc51e206SEvan Bacon      ...prev,
46dc51e206SEvan Bacon      [platform]: bundles[index],
47dc51e206SEvan Bacon    }),
48dc51e206SEvan Bacon    {}
49dc51e206SEvan Bacon  );
50dc51e206SEvan Bacon}
51