Parse, generate and combine Source Map files. All line numbers and column numbers are zero-indexed.
Parse Source Map
// Parsing source map data.
SourceMap map = new SourceMapImpl(
"{\n" +
" \"version\":3,\n" +
" \"sources\":[\"/script.js\"],\n" +
" \"names\":[],\n" +
" \"mappings\":\"AAAA,KAAU;;AAIV,KAKA;\"\n" +
"}"
);
// Get single mapping.
System.out.println("Single mapping: " + map.getMapping(0, 5));
// Iterate over each mapping.
System.out.println("All mappings:");
map.eachMapping(new SourceMap.EachMappingCallback() { public void apply(Mapping mapping) {
System.out.println(mapping);
}});
Generate Source Map
SourceMap map = new SourceMapImpl();
map.addMapping(0, 0, 0, 0, "/script.js");
map.addMapping(0, 5, 0, 10, "/script.js");
map.addMapping(2, 0, 4, 0, "/script.js");
map.addMapping(2, 5, 9, 0, "/script.js");
System.out.println("Generated Source Map: " + map.generate());
Add offset for Source Map, needed when some postprocessing applied to generated file. Like wrapping in try/catch
block and adding one line before and after.
SourceMap map = new SourceMapImpl();
map.addMapping(0, 0, 0, 0, "/script.js");
SourceMap mapWithOffset = Util.offset(map, 1);
System.out.println("Source Map after applying offset: " + mapWithOffset.generateForHumans());
Rebase source map, needed when multiple transformation applied to the source. In example below two transformation applied CoffeeScript -> JavaScript -> Minified JavaScript.
SourceMap coffeeToJs = new SourceMapImpl();
coffeeToJs.addMapping(1, 0, 0, 0, "/script.coffee");
SourceMap jsToMinJs = new SourceMapImpl();
jsToMinJs.addMapping(2, 0, 1, 0, "/script.js");
SourceMap minJsToCoffee = Util.rebase(jsToMinJs, coffeeToJs);
System.out.println("SourceMap for CoffeeScript -> JS -> MinJS: " + minJsToCoffee.generateForHumans());
Join multiple Source Map in one file, needed when files joined in batch. In example below
two files a.js
and b.js
joined in batch.js
.
// Source Map for a.js
String a = "var a = 0;";
SourceMap mapA = new SourceMapImpl();
mapA.addMapping(0, 0, 0, 0, "/a.js");
// Source Map for b.js
String b = "var b = 0;";
SourceMap mapB = new SourceMapImpl();
mapB.addMapping(0, 0, 0, 0, "/b.js");
// Source Map for a.js and b.js joined into batch.js.
SourceMapJoiner joiner = Util.joiner();
joiner.addSourceMap(mapA, Util.countLines(a), 0);
joiner.addSourceMap(mapB, Util.countLines(b), 0);
SourceMap batchMap = joiner.join();
System.out.println("Source Map for batch.js: " + batchMap.generateForHumans());
Note: offset
, join
and rebase
could be combined in arbitrary order, so it is possible to create Source Map
for minified batch of CoffeeScript files etc.
Some code based on the code from Google Closure Compiler.
Released under the Apache License, Version 2.0