Accept filename-to-file-content hash as code parameter of generate.

This commit is contained in:
Dale Bustad 2016-02-04 22:58:19 -08:00
parent 26dcd6400f
commit f007b51554
2 changed files with 51 additions and 2 deletions

View File

@ -44,4 +44,47 @@ name | type | default | description
sourceMaps | boolean | `false` | Enable generating source maps
sourceMapTarget | string | | The filename of the generated code that the source map will be associated with
sourceRoot | string | | A root for all relative URLs in the source map
sourceFileName | string | | The filename for the source code (i.e. the code in the `code` argument)
sourceFileName | string | | The filename for the source code (i.e. the code in the `code` argument). This will only be used if `code` is a string.
## AST from Multiple Sources
In most cases, Babel does a 1:1 transformation of input-file to output-file. However,
you may be dealing with AST constructed from multiple sources - JS files, templates, etc.
If this is the case, and you want the sourcemaps to reflect the correct sources, you'll need
to make some changes to your code.
First, each node with a `loc` property (which indicates that node's original placement in the
source document) must also include a `loc.filename` property, set to the source filename.
Second, you should pass an object to `generate` as the `code` parameter. Keys
should be the source filenames, and values should be the source content.
Here's an example of what that might look like:
```js
import {parse} from 'babylon';
import traverse from "babel-traverse";
import generate from 'babel-generator';
function addFilename (ast, filename) {
traverse.cheap(ast, node => {
if (node.loc) { node.loc.source = sourcePath };
});
}
const a = 'var a = 1;';
const b = 'var b = 2;';
const astA = addFilename(parse(a), 'a.js');
const astB = addFilename(parse(b), 'b.js');
const ast = {
type: 'Program',
body: [].concat(astA.body, ast2.body)
};
const { code, map } = generate(ast, { /* options */ }, {
'a.js': a,
'b.js': b
});
// Sourcemap will point to both a.js and b.js where appropriate.
```

View File

@ -17,7 +17,13 @@ export default class SourceMap {
sourceRoot: opts.sourceRoot
});
this.map.setSourceContent(opts.sourceFileName, code);
if (typeof code === "string") {
this.map.setSourceContent(opts.sourceFileName, code);
} else if (typeof code === "object") {
Object.keys(code).forEach((sourceFileName) => {
this.map.setSourceContent(sourceFileName, code[sourceFileName]);
});
}
} else {
this.map = null;
}