diff --git a/packages/react-dev-utils/formatWebpackMessages.js b/packages/react-dev-utils/formatWebpackMessages.js index 1d0f7c5cdae..53a48e3fea1 100644 --- a/packages/react-dev-utils/formatWebpackMessages.js +++ b/packages/react-dev-utils/formatWebpackMessages.js @@ -13,18 +13,33 @@ function isLikelyASyntaxError(message) { return message.indexOf(friendlySyntaxErrorLabel) !== -1; } +function cleanTerminalColors(input) { + // Regular expression to match ANSI escape codes + const ansiRegex = /\x1B\[[0-9;]*[a-zA-Z]/g; + // Remove ANSI escape codes from the input string + return input.replace(ansiRegex, ''); +} + // Cleans up webpack error messages. function formatMessage(message) { let lines = []; if (typeof message === 'string') { - lines = message.split('\n'); + lines = cleanTerminalColors(message).split('\n'); } else if ('message' in message) { - lines = message['message'].split('\n'); + lines = cleanTerminalColors(message['message']).split('\n'); + // ensure message contains filename + if ('file' in message && !message['message'].includes(message.file)) { + lines.unshift("While building top file: " + message.file); + } } else if (Array.isArray(message)) { message.forEach(message => { if ('message' in message) { - lines = message['message'].split('\n'); + lines = cleanTerminalColors(message['message']).split('\n'); + // ensure message contains filename + if ('file' in message && !message['message'].includes(message.file)) { + lines.unshift("While building top file: " + message.file); + } } }); } diff --git a/packages/react-scripts/scripts/build.js b/packages/react-scripts/scripts/build.js index 7a3a635a5d3..6b92148429b 100644 --- a/packages/react-scripts/scripts/build.js +++ b/packages/react-scripts/scripts/build.js @@ -173,8 +173,12 @@ function build(previousFileSizes) { if (messages.errors.length) { // Only keep the first error. Others are often indicative // of the same problem, but confuse the reader with noise. - if (messages.errors.length > 1) { - messages.errors.length = 1; + const re = /\S+:\d+:\d+/; // check if error message has filename with line number, to not print errors with no filename or line number + for(let i = 0; i < messages.errors.length; i++) { + if(re.test(messages.errors[i])) { + messages.errors.length = i+1; + break; + } } return reject(new Error(messages.errors.join('\n\n'))); }