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.
79 lines
2.3 KiB
79 lines
2.3 KiB
const ErrorStackParser = require('error-stack-parser'); |
|
const theme = require('../theme.js'); |
|
const utils = require('../utils.js'); |
|
|
|
/** |
|
* @typedef {Object} RuntimeErrorStackProps |
|
* @property {Error} error |
|
*/ |
|
|
|
/** |
|
* A formatter that turns runtime error stacks into highlighted HTML stacks. |
|
* @param {Document} document |
|
* @param {HTMLElement} root |
|
* @param {RuntimeErrorStackProps} props |
|
* @returns {void} |
|
*/ |
|
function RuntimeErrorStack(document, root, props) { |
|
const stackTitle = document.createElement('h4'); |
|
stackTitle.innerText = 'Call Stack'; |
|
stackTitle.style.color = '#' + theme.white; |
|
stackTitle.style.fontSize = '1.0625rem'; |
|
stackTitle.style.fontWeight = '500'; |
|
stackTitle.style.lineHeight = '1.3'; |
|
stackTitle.style.margin = '0 0 0.5rem'; |
|
|
|
const stackContainer = document.createElement('div'); |
|
stackContainer.style.fontSize = '0.8125rem'; |
|
stackContainer.style.lineHeight = '1.3'; |
|
stackContainer.style.whiteSpace = 'pre-wrap'; |
|
|
|
let errorStacks; |
|
try { |
|
errorStacks = ErrorStackParser.parse(props.error); |
|
} catch (e) { |
|
errorStacks = []; |
|
stackContainer.innerHTML = 'No stack trace is available for this error!'; |
|
} |
|
|
|
for (let i = 0; i < Math.min(errorStacks.length, 10); i += 1) { |
|
const currentStack = errorStacks[i]; |
|
|
|
const functionName = document.createElement('code'); |
|
functionName.innerHTML = ' ' + currentStack.functionName || '(anonymous function)'; |
|
functionName.style.color = '#' + theme.yellow; |
|
functionName.style.fontFamily = [ |
|
'"Operator Mono SSm"', |
|
'"Operator Mono"', |
|
'"Fira Code Retina"', |
|
'"Fira Code"', |
|
'"FiraCode-Retina"', |
|
'"Andale Mono"', |
|
'"Lucida Console"', |
|
'Menlo', |
|
'Consolas', |
|
'Monaco', |
|
'monospace', |
|
].join(', '); |
|
|
|
const fileName = document.createElement('div'); |
|
fileName.innerHTML = |
|
'  ' + |
|
utils.formatFilename(currentStack.fileName) + |
|
':' + |
|
currentStack.lineNumber + |
|
':' + |
|
currentStack.columnNumber; |
|
fileName.style.color = '#' + theme.white; |
|
fileName.style.fontSize = '0.6875rem'; |
|
fileName.style.marginBottom = '0.25rem'; |
|
|
|
stackContainer.appendChild(functionName); |
|
stackContainer.appendChild(fileName); |
|
} |
|
|
|
root.appendChild(stackTitle); |
|
root.appendChild(stackContainer); |
|
} |
|
|
|
module.exports = RuntimeErrorStack;
|
|
|