import { SourceMapConsumer } from 'source-map-js'
export function parseSourceMaps(result) {
const map = result.map.toJSON()
return {
sources: map.sources,
annotations: annotatedMappings(map),
}
}
function annotatedMappings(map) {
const smc = new SourceMapConsumer(map)
const annotations = {}
smc.eachMapping((mapping) => {
let annotation = (annotations[mapping.generatedLine] = annotations[mapping.generatedLine] || {
...mapping,
original: {
start: [mapping.originalLine, mapping.originalColumn],
end: [mapping.originalLine, mapping.originalColumn],
},
generated: {
start: [mapping.generatedLine, mapping.generatedColumn],
end: [mapping.generatedLine, mapping.generatedColumn],
},
})
annotation.generated.end[0] = mapping.generatedLine
annotation.generated.end[1] = mapping.generatedColumn
annotation.original.end[0] = mapping.originalLine
annotation.original.end[1] = mapping.originalColumn
})
return Object.values(annotations).map((annotation) => {
return `${formatRange(annotation.original)} -> ${formatRange(annotation.generated)}`
})
}
function formatRange(range) {
if (range.start[0] === range.end[0]) {
if (range.start[1] === range.end[1]) {
return `${range.start[0]}:${range.start[1]}`
}
return `${range.start[0]}:${range.start[1]}-${range.end[1]}`
}
return `${range.start[0]}:${range.start[1]}-${range.end[0]}:${range.end[1]}`
}