Accept filename-to-file-content hash as code parameter of generate.
This commit is contained in:
parent
26dcd6400f
commit
f007b51554
@ -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.
|
||||
```
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user