babel-core: add options for different parser/generator (#3561)
* babel-core: add options for different parser/generator * test for experiemental plugins, other babylon options * fix passing options into parser * Fix when no code is provided * fixup tests * fix tests again * use filename and fallback to cwd
This commit is contained in:
@@ -21,6 +21,8 @@ import * as util from "../../util";
|
||||
import path from "path";
|
||||
import * as t from "babel-types";
|
||||
|
||||
import resolve from "../../helpers/resolve";
|
||||
|
||||
import blockHoistPlugin from "../internal-plugins/block-hoist";
|
||||
import shadowFunctionsPlugin from "../internal-plugins/shadow-functions";
|
||||
|
||||
@@ -411,8 +413,35 @@ export default class File extends Store {
|
||||
}
|
||||
|
||||
parse(code: string) {
|
||||
let parseCode = parse;
|
||||
let parserOpts = this.opts.parserOpts || this.parserOpts;
|
||||
|
||||
if (parserOpts) {
|
||||
parserOpts = Object.assign({}, this.parserOpts, parserOpts);
|
||||
|
||||
if (parserOpts.parser) {
|
||||
if (typeof parserOpts.parser === "string") {
|
||||
let dirname = path.dirname(this.opts.filename) || process.cwd();
|
||||
let parser = resolve(parserOpts.parser, dirname);
|
||||
if (parser) {
|
||||
parseCode = require(parser).parse;
|
||||
} else {
|
||||
throw new Error(`Couldn't find parser ${parserOpts.parser} with "parse" method relative to directory ${dirname}`);
|
||||
}
|
||||
} else {
|
||||
parseCode = parserOpts.parser;
|
||||
}
|
||||
|
||||
parserOpts.parser = {
|
||||
parse(source) {
|
||||
return parse(source, parserOpts);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
this.log.debug("Parse start");
|
||||
let ast = parse(code, this.parserOpts);
|
||||
let ast = parseCode(code, parserOpts);
|
||||
this.log.debug("Parse stop");
|
||||
return ast;
|
||||
}
|
||||
@@ -573,9 +602,24 @@ export default class File extends Store {
|
||||
let result: BabelFileResult = { ast };
|
||||
if (!opts.code) return this.makeResult(result);
|
||||
|
||||
let gen = generate;
|
||||
if (opts.generatorOpts.generator) {
|
||||
gen = opts.generatorOpts.generator;
|
||||
|
||||
if (typeof gen === "string") {
|
||||
let dirname = path.dirname(this.opts.filename) || process.cwd();
|
||||
let generator = resolve(gen, dirname);
|
||||
if (generator) {
|
||||
gen = require(generator).print;
|
||||
} else {
|
||||
throw new Error(`Couldn't find generator ${gen} with "print" method relative to directory ${dirname}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.log.debug("Generation start");
|
||||
|
||||
let _result = generate(ast, opts, this.code);
|
||||
let _result = gen(ast, opts.generatorOpts ? Object.assign(opts, opts.generatorOpts) : opts, this.code);
|
||||
result.code = _result.code;
|
||||
result.map = _result.map;
|
||||
|
||||
|
||||
@@ -198,4 +198,16 @@ module.exports = {
|
||||
default: false,
|
||||
hidden: true,
|
||||
},
|
||||
|
||||
// Deprecate top level parserOpts
|
||||
parserOpts: {
|
||||
description: "Options to pass into the parser, or to change parsers (parserOpts.parser)",
|
||||
default: false
|
||||
},
|
||||
|
||||
// Deprecate top level generatorOpts
|
||||
generatorOpts: {
|
||||
description: "Options to pass into the generator, or to change generators (generatorOpts.generator)",
|
||||
default: false
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user