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