source-map-concat

Concatenate files with source maps.

Overview

Concatenate files with source maps.

var fs     = require("fs")
var path   = require("path")
var concat = require("source-map-concat")
 
var resolveSourceMapSync = require("source-map-resolve").resolveSourceMapSync
var createDummySourceMap = require("source-map-dummy")
 
var jsFiles = ["foo.js", "subdir/bar.js", "../baz.js"]
 
jsFiles = jsFiles.map(function(file) {
  return {
    source:  file,
    code: fs.readFileSync(file).toString()
  }
})
jsFiles.forEach(function(file) {
  var previousMap = resolveSourceMapSync(file.code, file.source, fs.readFileSync)
  if (previousMap) {
    file.map = previousMap.map
    file.sourcesRelativeTo = previousMap.sourcesRelativeTo
  } else {
    file.map = createDummySourceMap(file.code, {source: file.source, type: "js"})
  }
})
 
function wrap(node, file) {
  node.prepend("void function(){\n// File: " + file.source + "\n")
  node.add("}();")
}
 
var output = "subdir/bundle.js"
 
var concatenated = concat(jsFiles, {
  delimiter: "\n",
  process: wrap,
  mapPath: output + ".map"
})
 
concatenated.prepend("/* Bruce Banner */\n")
concatenated.add("\n/* Footer */")
 
var result = concatenated.toStringWithSourceMap({
  file: path.basename(output)
})
 
fs.writeFileSync(output, result.code)
fs.writeFileSync(output + ".map", result.map.toString())

Installation

npm install source-map-concat

var concat = require("source-map-concat")

Usage

files is an array of objects with the following properties:

  • code: The contents of the file, as a string.
  • map: The source map of the file, if any, as an object, a string or anything with a .toJSON() method (such as a SourceMapGenerator). It could be taken straight from a compiler, be resolved using source-map-resolve or created using source-map-dummy.
  • sourcesRelativeTo: A path that file.map.sources are relative to. Defaults to ..

options:

  • delimiter: A string to insert between each file.
  • process(node, file, index): A function to call on each file in files. node is a SourceNode. You could use this to wrap JavaScript files in IIFEs, for example.
  • mapPath: The path to where you intend to write the source map of the produced concatenated file. Defaults to ..

The files in files will be concatenated into a SourceNode which is returned. You may then modify this source node if you wish (node.add(...) for example). When you’re done, call node.toStringWithSourceMap(), which returns an object with a code property containing the concatenated code, and a map property containing the source map.

License

The X11 (“MIT”) License.