/* @flow */
|
|
const SourceMapConsumer = require('source-map').SourceMapConsumer
|
|
const filenameRE = /\(([^)]+\.js):(\d+):(\d+)\)$/
|
|
export function createSourceMapConsumers (rawMaps: Object) {
|
const maps = {}
|
Object.keys(rawMaps).forEach(file => {
|
maps[file] = new SourceMapConsumer(rawMaps[file])
|
})
|
return maps
|
}
|
|
export function rewriteErrorTrace (e: any, mapConsumers: {
|
[key: string]: SourceMapConsumer
|
}) {
|
if (e && typeof e.stack === 'string') {
|
e.stack = e.stack.split('\n').map(line => {
|
return rewriteTraceLine(line, mapConsumers)
|
}).join('\n')
|
}
|
}
|
|
function rewriteTraceLine (trace: string, mapConsumers: {
|
[key: string]: SourceMapConsumer
|
}) {
|
const m = trace.match(filenameRE)
|
const map = m && mapConsumers[m[1]]
|
if (m != null && map) {
|
const originalPosition = map.originalPositionFor({
|
line: Number(m[2]),
|
column: Number(m[3])
|
})
|
if (originalPosition.source != null) {
|
const { source, line, column } = originalPosition
|
const mappedPosition = `(${source.replace(/^webpack:\/\/\//, '')}:${String(line)}:${String(column)})`
|
return trace.replace(filenameRE, mappedPosition)
|
} else {
|
return trace
|
}
|
} else {
|
return trace
|
}
|
}
|