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