16d6b81f9SEvan Baconimport { getConfig } from '@expo/config';
26d6b81f9SEvan Baconimport chalk from 'chalk';
36d6b81f9SEvan Bacon
4*8a424bebSJames Ideimport { Options } from './resolveOptions';
553b4c0b0SEvan Baconimport { Log } from '../../log';
653b4c0b0SEvan Baconimport { WebSupportProjectPrerequisite } from '../../start/doctor/web/WebSupportProjectPrerequisite';
76d6b81f9SEvan Baconimport { getPlatformBundlers } from '../../start/server/platformBundlers';
853b4c0b0SEvan Baconimport { WebpackBundlerDevServer } from '../../start/server/webpack/WebpackBundlerDevServer';
96d6b81f9SEvan Baconimport { CommandError } from '../../utils/errors';
106a750d06SEvan Baconimport { setNodeEnv } from '../../utils/nodeEnv';
1153b4c0b0SEvan Bacon
1253b4c0b0SEvan Baconexport async function exportWebAsync(projectRoot: string, options: Options) {
1353b4c0b0SEvan Bacon  // Ensure webpack is available
1453b4c0b0SEvan Bacon  await new WebSupportProjectPrerequisite(projectRoot).assertAsync();
1553b4c0b0SEvan Bacon
166a750d06SEvan Bacon  setNodeEnv(options.dev ? 'development' : 'production');
176a750d06SEvan Bacon  require('@expo/env').load(projectRoot);
186a750d06SEvan Bacon
196d6b81f9SEvan Bacon  const { exp } = getConfig(projectRoot);
206d6b81f9SEvan Bacon  const platformBundlers = getPlatformBundlers(exp);
2153b4c0b0SEvan Bacon  // Create a bundler interface
226d6b81f9SEvan Bacon  const bundler = new WebpackBundlerDevServer(projectRoot, platformBundlers, false);
236d6b81f9SEvan Bacon
246d6b81f9SEvan Bacon  // If the user set `web.bundler: 'metro'` then they should use `expo export` instead.
256d6b81f9SEvan Bacon  if (!bundler.isTargetingWeb()) {
266d6b81f9SEvan Bacon    throw new CommandError(
276d6b81f9SEvan Bacon      chalk`{bold expo export:web} can only be used with Webpack. Use {bold expo export} for other bundlers.`
286d6b81f9SEvan Bacon    );
296d6b81f9SEvan Bacon  }
3053b4c0b0SEvan Bacon
3153b4c0b0SEvan Bacon  Log.log(`Exporting with Webpack...`);
3253b4c0b0SEvan Bacon
3353b4c0b0SEvan Bacon  // Bundle the app
3453b4c0b0SEvan Bacon  await bundler.bundleAsync({
3553b4c0b0SEvan Bacon    mode: options.dev ? 'development' : 'production',
3653b4c0b0SEvan Bacon    clear: options.clear,
3753b4c0b0SEvan Bacon  });
3853b4c0b0SEvan Bacon}
39