From 3df9328df7f39cf4620e5d56c9ea1a2543c17bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Kostrzewski?= Date: Sat, 8 Jul 2017 11:27:49 +0200 Subject: [PATCH 1/2] feat(build, watch): Less verbose error output --- src/lib/webpack/run-webpack.js | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/lib/webpack/run-webpack.js b/src/lib/webpack/run-webpack.js index 15e8576a4..91310c29c 100644 --- a/src/lib/webpack/run-webpack.js +++ b/src/lib/webpack/run-webpack.js @@ -38,7 +38,12 @@ const devBuild = async (env, onprogress) => { let serverAddr = `${protocol}://${host}:${chalk.bold(port)}`; let localIpAddr = `${protocol}://${ip.address()}:${chalk.bold(port)}`; - process.stdout.write(chalk.green('\nCompiled successfully!!\n\n')); + if (stats.hasErrors()) { + process.stdout.write(chalk.red('\Build failed!\n\n')); + } else { + process.stdout.write(chalk.green('\nCompiled successfully!\n\n')); + } + if (userPort !== port) { process.stdout.write(`Port ${chalk.bold(userPort)} is in use, using ${chalk.bold(port)} instead\n\n`); } @@ -71,7 +76,8 @@ const prodBuild = async (env) => { return await new Promise((resolve, reject) => { compiler.run((err, stats) => { if (err || stats.hasErrors()) { - reject(err || stats.toJson().errors.join('\n')); + showStats(stats); + reject(chalk.red('Build failed!')); } else { // Timeout for plugins that work on `after-emit` event of webpack @@ -82,16 +88,16 @@ const prodBuild = async (env) => { }; export function showStats(stats) { - let info = stats.toJson(); + let info = stats.toJson("errors-only"); if (stats.hasErrors()) { - info.errors.forEach( message => { - process.stderr.write(message+'\n'); + info.errors.map(stripBabelLoaderPrefix).forEach( message => { + process.stderr.write(chalk.red(message)+'\n'); }); } if (stats.hasWarnings()) { - info.warnings.forEach( message => { + info.warnings.map(stripBabelLoaderPrefix).forEach( message => { process.stderr.write(chalk.yellow(message)+'\n'); }); } @@ -109,8 +115,8 @@ export function writeJsonStats(stats) { jsonStats = (jsonStats.children && jsonStats.children[0]) || jsonStats; - jsonStats.modules.forEach(normalizeModule); - jsonStats.chunks.forEach(c => c.modules.forEach(normalizeModule)); + jsonStats.modules.forEach(stripBabelLoaderFromModuleNames); + jsonStats.chunks.forEach(c => c.modules.forEach(stripBabelLoaderFromModuleNames)); return fs.writeFile(outputPath, JSON.stringify(jsonStats)) .then(() => { @@ -121,20 +127,20 @@ export function writeJsonStats(stats) { }); } -const normalizeModule = m => { +const stripBabelLoaderFromModuleNames = m => { const keysToNormalize = ['identifier', 'name', 'module', 'moduleName', 'moduleIdentifier']; keysToNormalize.forEach(key => { if (key in m) { - m[key] = normalizeName(m[key]); + m[key] = stripBabelLoaderPrefix(m[key]); } }); if (m.reasons) { - m.reasons.forEach(normalizeModule); + m.reasons.forEach(stripBabelLoaderFromModuleNames); } return m; }; -const normalizeName = p => p.substr(p.lastIndexOf('!') + 1); +const stripBabelLoaderPrefix = log => log.replace(/@?\s*(\.\/~\/babel-loader\/lib\?{[\s\S]*?}!)/g, ''); From 031d6cbc76b1a4f3064eafd67950c2fdc3c2f511 Mon Sep 17 00:00:00 2001 From: Anup Date: Sun, 9 Jul 2017 01:06:43 +0530 Subject: [PATCH 2/2] Clear console before throwing error stack trace in terminal --- src/lib/webpack/run-webpack.js | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/lib/webpack/run-webpack.js b/src/lib/webpack/run-webpack.js index 91310c29c..d2ba5dd49 100644 --- a/src/lib/webpack/run-webpack.js +++ b/src/lib/webpack/run-webpack.js @@ -26,23 +26,21 @@ const devBuild = async (env, onprogress) => { let compiler = webpack(config); return await new Promise((resolve, reject) => { - let first = true; + compiler.plugin('done', stats => { - if (first) { - first = false; - let devServer = config.devServer; + let devServer = config.devServer; - let protocol = devServer.https ? 'https' : 'http'; - let host = process.env.HOST || devServer.host || 'localhost'; + let protocol = devServer.https ? 'https' : 'http'; + let host = process.env.HOST || devServer.host || 'localhost'; - let serverAddr = `${protocol}://${host}:${chalk.bold(port)}`; - let localIpAddr = `${protocol}://${ip.address()}:${chalk.bold(port)}`; + let serverAddr = `${protocol}://${host}:${chalk.bold(port)}`; + let localIpAddr = `${protocol}://${ip.address()}:${chalk.bold(port)}`; - if (stats.hasErrors()) { - process.stdout.write(chalk.red('\Build failed!\n\n')); - } else { - process.stdout.write(chalk.green('\nCompiled successfully!\n\n')); - } + clearConsole(); + if (stats.hasErrors()) { + process.stdout.write(chalk.red('\Build failed!\n\n')); + } else { + process.stdout.write(chalk.green('\nCompiled successfully!\n\n')); if (userPort !== port) { process.stdout.write(`Port ${chalk.bold(userPort)} is in use, using ${chalk.bold(port)} instead\n\n`); @@ -51,6 +49,7 @@ const devBuild = async (env, onprogress) => { process.stdout.write(`${chalk.bold('Local:')} ${serverAddr}\n`); process.stdout.write(`${chalk.bold('On Your Network:')} ${localIpAddr}\n`); } + if (onprogress) onprogress(stats); }); compiler.plugin('failed', reject); @@ -127,6 +126,12 @@ export function writeJsonStats(stats) { }); } +const clearConsole = () => { + process.stdout.write( + process.platform === 'win32' ? '\x1Bc' : '\x1B[2J\x1B[3J\x1B[H' + ); +}; + const stripBabelLoaderFromModuleNames = m => { const keysToNormalize = ['identifier', 'name', 'module', 'moduleName', 'moduleIdentifier'];