Skip to content

Instantly share code, notes, and snippets.

@bengourley
Last active November 2, 2023 02:05
Show Gist options
  • Star 17 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save bengourley/c3c62e41c9b579ecc1d51e9d9eb8b9d2 to your computer and use it in GitHub Desktop.
Save bengourley/c3c62e41c9b579ecc1d51e9d9eb8b9d2 to your computer and use it in GitHub Desktop.
//
// This program reads a sourcemap from stdin
// and replaces the "mappings" property with
// human readable content. It writes the output
// to stdout.
//
// 1. install the dependencies:
// npm i concat-stream vlq
//
// 2. optional: install jq for pretty printing json
//
// 3. run the command like so:
//
// cat my-source-map.js.map | node decode | jq .
//
const concat = require('concat-stream')
const vlq = require('vlq')
const formatMappings = (mappings, sources, names) => {
const vlqState = [ 0, 0, 0, 0, 0 ]
return mappings.split(';').reduce((accum, line, i) => {
accum[i + 1] = formatLine(line, vlqState, sources, names)
vlqState[0] = 0
return accum
}, {})
}
const formatLine = (line, state, sources, names) => {
const segs = line.split(',')
return segs.map(seg => {
if (!seg) return ''
const decoded = vlq.decode(seg)
for (var i = 0; i < 5; i++) {
state[i] = typeof decoded[i] === 'number' ? state[i] + decoded[i] : state[i]
}
return formatSegment(...state.concat([ sources, names ]))
})
}
const formatSegment = (col, source, sourceLine, sourceCol, name, sources, names) =>
`${col + 1} => ${sources[source]} ${sourceLine + 1}:${sourceCol + 1}${names[name] ? ` ${names[name]}` : ``}`
process.stdin.pipe(concat((json) => {
const map = JSON.parse(json)
process.stdout.write(JSON.stringify({
...map,
mappings: formatMappings(map.mappings, map.sources, map.names)
}))
}))
Copy link

ghost commented Jul 24, 2021

Thank you for your guide/blog post! Really helped me (alongside the official source map rev. 3 proposal) to understanding source maps.

@yael-screenovate
Copy link

yael-screenovate commented Jun 9, 2022

@bengourley im getting

$ cat types.js.map | node decode .
stdin is not a tty

Can you please help me?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment