66 lines
1.5 KiB
JavaScript
66 lines
1.5 KiB
JavaScript
import * as ErrorOverlay from "react-error-overlay"
|
|
|
|
// Report runtime errors
|
|
ErrorOverlay.startReportingRuntimeErrors({
|
|
onError: () => {},
|
|
filename: `/commons.js`,
|
|
})
|
|
ErrorOverlay.setEditorHandler(errorLocation =>
|
|
window.fetch(
|
|
`/__open-stack-frame-in-editor?fileName=` +
|
|
window.encodeURIComponent(errorLocation.fileName) +
|
|
`&lineNumber=` +
|
|
window.encodeURIComponent(errorLocation.lineNumber || 1)
|
|
)
|
|
)
|
|
|
|
const errorMap = {}
|
|
|
|
function flat(arr) {
|
|
return Array.prototype.flat ? arr.flat() : [].concat(...arr)
|
|
}
|
|
|
|
const handleErrorOverlay = () => {
|
|
const errors = Object.values(errorMap)
|
|
let errorStringsToDisplay = []
|
|
if (errors.length > 0) {
|
|
errorStringsToDisplay = flat(errors)
|
|
.map(error => {
|
|
if (typeof error === `string`) {
|
|
return error
|
|
} else if (typeof error === `object`) {
|
|
const errorStrBuilder = [error.text]
|
|
|
|
if (error.filePath) {
|
|
errorStrBuilder.push(`File: ${error.filePath}`)
|
|
}
|
|
|
|
return errorStrBuilder.join(`\n\n`)
|
|
}
|
|
|
|
return null
|
|
})
|
|
.filter(Boolean)
|
|
}
|
|
|
|
if (errorStringsToDisplay.length > 0) {
|
|
ErrorOverlay.reportBuildError(errorStringsToDisplay.join(`\n\n`))
|
|
} else {
|
|
ErrorOverlay.dismissBuildError()
|
|
}
|
|
}
|
|
|
|
export const clearError = errorID => {
|
|
delete errorMap[errorID]
|
|
handleErrorOverlay()
|
|
}
|
|
|
|
export const reportError = (errorID, error) => {
|
|
if (error) {
|
|
errorMap[errorID] = error
|
|
}
|
|
handleErrorOverlay()
|
|
}
|
|
|
|
export { errorMap }
|