swc/scripts/sourcemap/decode.js
2022-05-04 14:25:28 +00:00

70 lines
1.8 KiB
JavaScript

// Copied from https://gist.github.com/bengourley/c3c62e41c9b579ecc1d51e9d9eb8b9d2
//
// 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),
})
);
})
);