You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.6 KiB
58 lines
1.6 KiB
const ansiHTML = require('ansi-html-community'); |
|
const entities = require('html-entities'); |
|
const theme = require('../theme.js'); |
|
const utils = require('../utils.js'); |
|
|
|
ansiHTML.setColors(theme); |
|
|
|
/** |
|
* @typedef {Object} CompileErrorTraceProps |
|
* @property {string} errorMessage |
|
*/ |
|
|
|
/** |
|
* A formatter that turns Webpack compile error messages into highlighted HTML source traces. |
|
* @param {Document} document |
|
* @param {HTMLElement} root |
|
* @param {CompileErrorTraceProps} props |
|
* @returns {void} |
|
*/ |
|
function CompileErrorTrace(document, root, props) { |
|
const errorParts = props.errorMessage.split('\n'); |
|
if (errorParts.length) { |
|
if (errorParts[0]) { |
|
errorParts[0] = utils.formatFilename(errorParts[0]); |
|
} |
|
|
|
const errorMessage = errorParts.splice(1, 1)[0]; |
|
if (errorMessage) { |
|
// Strip filename from the error message |
|
errorParts.unshift(errorMessage.replace(/^(.*:)\s.*:(\s.*)$/, '$1$2')); |
|
} |
|
} |
|
|
|
const stackContainer = document.createElement('pre'); |
|
stackContainer.innerHTML = entities.decode( |
|
ansiHTML(entities.encode(errorParts.join('\n'), { level: 'html5', mode: 'nonAscii' })), |
|
{ level: 'html5' } |
|
); |
|
stackContainer.style.fontFamily = [ |
|
'"Operator Mono SSm"', |
|
'"Operator Mono"', |
|
'"Fira Code Retina"', |
|
'"Fira Code"', |
|
'"FiraCode-Retina"', |
|
'"Andale Mono"', |
|
'"Lucida Console"', |
|
'Menlo', |
|
'Consolas', |
|
'Monaco', |
|
'monospace', |
|
].join(', '); |
|
stackContainer.style.margin = '0'; |
|
stackContainer.style.whiteSpace = 'pre-wrap'; |
|
|
|
root.appendChild(stackContainer); |
|
} |
|
|
|
module.exports = CompileErrorTrace;
|
|
|