| "use strict"; | 
|   | 
| exports.__esModule = true; | 
|   | 
| var _assign = require("babel-runtime/core-js/object/assign"); | 
|   | 
| var _assign2 = _interopRequireDefault(_assign); | 
|   | 
| var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck"); | 
|   | 
| var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); | 
|   | 
| exports.default = buildConfigChain; | 
|   | 
| var _resolve = require("../../../helpers/resolve"); | 
|   | 
| var _resolve2 = _interopRequireDefault(_resolve); | 
|   | 
| var _json = require("json5"); | 
|   | 
| var _json2 = _interopRequireDefault(_json); | 
|   | 
| var _pathIsAbsolute = require("path-is-absolute"); | 
|   | 
| var _pathIsAbsolute2 = _interopRequireDefault(_pathIsAbsolute); | 
|   | 
| var _path = require("path"); | 
|   | 
| var _path2 = _interopRequireDefault(_path); | 
|   | 
| var _fs = require("fs"); | 
|   | 
| var _fs2 = _interopRequireDefault(_fs); | 
|   | 
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | 
|   | 
| var existsCache = {}; | 
| var jsonCache = {}; | 
|   | 
| var BABELIGNORE_FILENAME = ".babelignore"; | 
| var BABELRC_FILENAME = ".babelrc"; | 
| var PACKAGE_FILENAME = "package.json"; | 
|   | 
| function exists(filename) { | 
|   var cached = existsCache[filename]; | 
|   if (cached == null) { | 
|     return existsCache[filename] = _fs2.default.existsSync(filename); | 
|   } else { | 
|     return cached; | 
|   } | 
| } | 
|   | 
| function buildConfigChain() { | 
|   var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | 
|   var log = arguments[1]; | 
|   | 
|   var filename = opts.filename; | 
|   var builder = new ConfigChainBuilder(log); | 
|   | 
|   if (opts.babelrc !== false) { | 
|     builder.findConfigs(filename); | 
|   } | 
|   | 
|   builder.mergeConfig({ | 
|     options: opts, | 
|     alias: "base", | 
|     dirname: filename && _path2.default.dirname(filename) | 
|   }); | 
|   | 
|   return builder.configs; | 
| } | 
|   | 
| var ConfigChainBuilder = function () { | 
|   function ConfigChainBuilder(log) { | 
|     (0, _classCallCheck3.default)(this, ConfigChainBuilder); | 
|   | 
|     this.resolvedConfigs = []; | 
|     this.configs = []; | 
|     this.log = log; | 
|   } | 
|   | 
|   ConfigChainBuilder.prototype.findConfigs = function findConfigs(loc) { | 
|     if (!loc) return; | 
|   | 
|     if (!(0, _pathIsAbsolute2.default)(loc)) { | 
|       loc = _path2.default.join(process.cwd(), loc); | 
|     } | 
|   | 
|     var foundConfig = false; | 
|     var foundIgnore = false; | 
|   | 
|     while (loc !== (loc = _path2.default.dirname(loc))) { | 
|       if (!foundConfig) { | 
|         var configLoc = _path2.default.join(loc, BABELRC_FILENAME); | 
|         if (exists(configLoc)) { | 
|           this.addConfig(configLoc); | 
|           foundConfig = true; | 
|         } | 
|   | 
|         var pkgLoc = _path2.default.join(loc, PACKAGE_FILENAME); | 
|         if (!foundConfig && exists(pkgLoc)) { | 
|           foundConfig = this.addConfig(pkgLoc, "babel", JSON); | 
|         } | 
|       } | 
|   | 
|       if (!foundIgnore) { | 
|         var ignoreLoc = _path2.default.join(loc, BABELIGNORE_FILENAME); | 
|         if (exists(ignoreLoc)) { | 
|           this.addIgnoreConfig(ignoreLoc); | 
|           foundIgnore = true; | 
|         } | 
|       } | 
|   | 
|       if (foundIgnore && foundConfig) return; | 
|     } | 
|   }; | 
|   | 
|   ConfigChainBuilder.prototype.addIgnoreConfig = function addIgnoreConfig(loc) { | 
|     var file = _fs2.default.readFileSync(loc, "utf8"); | 
|     var lines = file.split("\n"); | 
|   | 
|     lines = lines.map(function (line) { | 
|       return line.replace(/#(.*?)$/, "").trim(); | 
|     }).filter(function (line) { | 
|       return !!line; | 
|     }); | 
|   | 
|     if (lines.length) { | 
|       this.mergeConfig({ | 
|         options: { ignore: lines }, | 
|         alias: loc, | 
|         dirname: _path2.default.dirname(loc) | 
|       }); | 
|     } | 
|   }; | 
|   | 
|   ConfigChainBuilder.prototype.addConfig = function addConfig(loc, key) { | 
|     var json = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _json2.default; | 
|   | 
|     if (this.resolvedConfigs.indexOf(loc) >= 0) { | 
|       return false; | 
|     } | 
|   | 
|     this.resolvedConfigs.push(loc); | 
|   | 
|     var content = _fs2.default.readFileSync(loc, "utf8"); | 
|     var options = void 0; | 
|   | 
|     try { | 
|       options = jsonCache[content] = jsonCache[content] || json.parse(content); | 
|       if (key) options = options[key]; | 
|     } catch (err) { | 
|       err.message = loc + ": Error while parsing JSON - " + err.message; | 
|       throw err; | 
|     } | 
|   | 
|     this.mergeConfig({ | 
|       options: options, | 
|       alias: loc, | 
|       dirname: _path2.default.dirname(loc) | 
|     }); | 
|   | 
|     return !!options; | 
|   }; | 
|   | 
|   ConfigChainBuilder.prototype.mergeConfig = function mergeConfig(_ref) { | 
|     var options = _ref.options, | 
|         alias = _ref.alias, | 
|         loc = _ref.loc, | 
|         dirname = _ref.dirname; | 
|   | 
|     if (!options) { | 
|       return false; | 
|     } | 
|   | 
|     options = (0, _assign2.default)({}, options); | 
|   | 
|     dirname = dirname || process.cwd(); | 
|     loc = loc || alias; | 
|   | 
|     if (options.extends) { | 
|       var extendsLoc = (0, _resolve2.default)(options.extends, dirname); | 
|       if (extendsLoc) { | 
|         this.addConfig(extendsLoc); | 
|       } else { | 
|         if (this.log) this.log.error("Couldn't resolve extends clause of " + options.extends + " in " + alias); | 
|       } | 
|       delete options.extends; | 
|     } | 
|   | 
|     this.configs.push({ | 
|       options: options, | 
|       alias: alias, | 
|       loc: loc, | 
|       dirname: dirname | 
|     }); | 
|   | 
|     var envOpts = void 0; | 
|     var envKey = process.env.BABEL_ENV || process.env.NODE_ENV || "development"; | 
|     if (options.env) { | 
|       envOpts = options.env[envKey]; | 
|       delete options.env; | 
|     } | 
|   | 
|     this.mergeConfig({ | 
|       options: envOpts, | 
|       alias: alias + ".env." + envKey, | 
|       dirname: dirname | 
|     }); | 
|   }; | 
|   | 
|   return ConfigChainBuilder; | 
| }(); | 
|   | 
| module.exports = exports["default"]; |