Concatenate files with source maps.


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 = {
  return {
    source:  file,
    code: fs.readFileSync(file).toString()
jsFiles.forEach(function(file) {
  var previousMap = resolveSourceMapSync(file.code, file.source, fs.readFileSync)
  if (previousMap) { =
    file.sourcesRelativeTo = previousMap.sourcesRelativeTo
  } else { = createDummySourceMap(file.code, {source: file.source, type: "js"})
function wrap(node, file) {
  node.prepend("void function(){\n// File: " + file.source + "\n")
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",


npm install source-map-concat

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


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 are relative to. Defaults to ..


  • 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.


The X11 (“MIT”) License.