I've designed the API change for SourceNode from a real use case, so I can say it would be really helpful to have it this way.

An example use case: concatenating files.

``` typescript
// interface
class Concatenator {
  addFile(fileName:string);
  toStringWithSourceMap(): {map, code};
}
```

Without changes in SourceNode

``` javascript
function Concatenator() {
  this.node = new SourceNode();
  this.sourcesContents = {};
}
Concatenator.prototype.addFile = function(fileName) {
  var content = fs.readFileSync(fileName);
  this.node.add(new SourceNode(1, 0, fileName, content);
  this.sourcesContents[fileName] = content;
};
Concatenator.prototype.toStringWithSourceMap = function() {
  var result = this.node.toStringWithSourceMap();
  for(var file: this.sourcesContents) {
    result.map.setSourceContent(file, this.sourcesContents[file]);
  }
  return result;
};
```

With the changes:

``` javascript
function Concatenator() {
  this.node = new SourceNode();
}
Concatenator.prototype.addFile = function(fileName) {
  var content = fs.readFileSync(fileName);
  this.node.add(new SourceNode(1, 0, fileName, content, content);
};
Concatenator.prototype.toStringWithSourceMap = function() {
  return this.node.toStringWithSourceMap();
};
```

It would be even complexer if fragments would contain stuff from multiple sources. You would have to keep a parallel map of all the source contents. If file generating is laied out into a function, it cannot just return a SourceNode, but must return a SourceNode and a map of source contents.

---

Adding only snippets of the original source would be a mess, because some fragments of the original source are not mapped, but they should be in the sourcesContents field (like comments). You have to keep an eye on not forgetting any fragment.

---

With this API design it is easy to change existing implementations by just adding the `aSourceContent` as parameter every time you pass the `aSource` parameter. 

Every SourceNode would have the source content, but this will not use up much additional memory as it's the same string.