diff --git a/bin/babel/util.js b/bin/babel/util.js index d6b6bc26c1..24afd62a12 100644 --- a/bin/babel/util.js +++ b/bin/babel/util.js @@ -1,10 +1,11 @@ -var readdir = require("fs-readdir-recursive"); -var index = require("./index"); -var babel = require("../../lib/babel/api/node"); -var util = require("../../lib/babel/util"); -var path = require("path"); -var fs = require("fs"); -var _ = require("lodash"); +var resolveRc = require("../../lib/babel/api/register/resolve-rc"); +var readdir = require("fs-readdir-recursive"); +var index = require("./index"); +var babel = require("../../lib/babel/api/node"); +var util = require("../../lib/babel/util"); +var path = require("path"); +var fs = require("fs"); +var _ = require("lodash"); exports.readdirFilter = function (filename) { return readdir(filename).filter(function (filename) { @@ -41,6 +42,7 @@ exports.transform = function (filename, code, opts) { }; exports.compile = function (filename, opts) { + resolveRc(filename, opts); var code = fs.readFileSync(filename, "utf8"); return exports.transform(filename, code, opts); }; diff --git a/lib/babel/api/register/node.js b/lib/babel/api/register/node.js index 56367f5fa4..1878f5542d 100644 --- a/lib/babel/api/register/node.js +++ b/lib/babel/api/register/node.js @@ -4,6 +4,7 @@ require("../../polyfill"); var sourceMapSupport = require("source-map-support"); var registerCache = require("./cache"); +var resolveRc = require("./resolve-rc"); var extend = require("lodash/object/extend"); var babel = require("../node"); var each = require("lodash/collection/each"); @@ -44,7 +45,10 @@ var mtime = function (filename) { var compile = function (filename) { var result; - var cacheKey = filename + ":" + JSON.stringify(transformOpts); + var opts = extend({}, transformOpts); + resolveRc(filename, opts); + + var cacheKey = filename + ":" + JSON.stringify(opts); if (cache) { var cached = cache[cacheKey]; @@ -54,10 +58,10 @@ var compile = function (filename) { } if (!result) { - result = babel.transformFileSync(filename, extend({ + result = babel.transformFileSync(filename, extend(opts, { sourceMap: true, ast: false - }, transformOpts)); + })); } if (cache) { diff --git a/lib/babel/api/register/resolve-rc.js b/lib/babel/api/register/resolve-rc.js new file mode 100644 index 0000000000..80d16e9a9f --- /dev/null +++ b/lib/babel/api/register/resolve-rc.js @@ -0,0 +1,45 @@ +"use strict"; + +var merge = require("lodash/object/merge"); +var path = require("path"); +var fs = require("fs"); + +var cache = {}; + +function exists(filename) { + var cached = cache[filename]; + if (cached != null) return cached; + return cache[filename] = fs.existsSync(filename);; +} + +module.exports = function (loc, opts) { + var rel = ".babelrc"; + opts = opts || {}; + + function find(start, rel) { + var file = path.join(start, rel); + + if (exists(file)) { + var file = fs.readFileSync(file, "utf8"); + var json; + + try { + json = JSON.parse(file); + } catch (err) { + err.filename = file + ": " + err.filename; + throw err; + } + + opts = merge(json, opts); + } + + var up = path.dirname(start); + if (up !== start) { // root + find(up, rel); + } + } + + find(loc, rel); + + return opts; +};