153b4c0b0SEvan Baconimport chalk from 'chalk'; 253b4c0b0SEvan Baconimport { promisify } from 'util'; 353b4c0b0SEvan Baconimport type webpack from 'webpack'; 453b4c0b0SEvan Bacon 5*8a424bebSJames Ideimport { formatWebpackMessages } from './formatWebpackMessages'; 653b4c0b0SEvan Baconimport * as Log from '../../../log'; 753b4c0b0SEvan Baconimport { CommandError } from '../../../utils/errors'; 853b4c0b0SEvan Bacon 953b4c0b0SEvan Bacon/** Run the `webpack` compiler and format errors/warnings. */ 1053b4c0b0SEvan Baconexport async function compileAsync(compiler: webpack.Compiler) { 1153b4c0b0SEvan Bacon const stats = await promisify(compiler.run.bind(compiler))(); 1253b4c0b0SEvan Bacon const { errors, warnings } = formatWebpackMessages( 1353b4c0b0SEvan Bacon stats.toJson({ all: false, warnings: true, errors: true }) 1453b4c0b0SEvan Bacon ); 1553b4c0b0SEvan Bacon if (errors?.length) { 1653b4c0b0SEvan Bacon // Only keep the first error. Others are often indicative 1753b4c0b0SEvan Bacon // of the same problem, but confuse the reader with noise. 1853b4c0b0SEvan Bacon if (errors.length > 1) { 1953b4c0b0SEvan Bacon errors.length = 1; 2053b4c0b0SEvan Bacon } 2153b4c0b0SEvan Bacon throw new CommandError('WEBPACK_BUNDLE', errors.join('\n\n')); 2253b4c0b0SEvan Bacon } 2353b4c0b0SEvan Bacon if (warnings?.length) { 2453b4c0b0SEvan Bacon Log.warn(chalk.yellow('Compiled with warnings\n')); 2553b4c0b0SEvan Bacon Log.warn(warnings.join('\n\n')); 2653b4c0b0SEvan Bacon } else { 2753b4c0b0SEvan Bacon Log.log(chalk.green('Compiled successfully')); 2853b4c0b0SEvan Bacon } 2953b4c0b0SEvan Bacon 3053b4c0b0SEvan Bacon return { errors, warnings }; 3153b4c0b0SEvan Bacon} 32