8ac22185c78afacf1b3b8bc137b2410309f1b9436c70c5230c8c2ed3ecc1cd5b5413e699e3449dcc720f6d5f3c1f22fdafe32aec3f21b7c42aa10ac19d0d5c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. "use strict";
  2. exports.__esModule = true;
  3. var _assign = require("babel-runtime/core-js/object/assign");
  4. var _assign2 = _interopRequireDefault(_assign);
  5. var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
  6. var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
  7. exports.default = buildConfigChain;
  8. var _resolve = require("../../../helpers/resolve");
  9. var _resolve2 = _interopRequireDefault(_resolve);
  10. var _json = require("json5");
  11. var _json2 = _interopRequireDefault(_json);
  12. var _pathIsAbsolute = require("path-is-absolute");
  13. var _pathIsAbsolute2 = _interopRequireDefault(_pathIsAbsolute);
  14. var _path = require("path");
  15. var _path2 = _interopRequireDefault(_path);
  16. var _fs = require("fs");
  17. var _fs2 = _interopRequireDefault(_fs);
  18. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  19. var existsCache = {};
  20. var jsonCache = {};
  21. var BABELIGNORE_FILENAME = ".babelignore";
  22. var BABELRC_FILENAME = ".babelrc";
  23. var PACKAGE_FILENAME = "package.json";
  24. function exists(filename) {
  25. var cached = existsCache[filename];
  26. if (cached == null) {
  27. return existsCache[filename] = _fs2.default.existsSync(filename);
  28. } else {
  29. return cached;
  30. }
  31. }
  32. function buildConfigChain() {
  33. var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  34. var log = arguments[1];
  35. var filename = opts.filename;
  36. var builder = new ConfigChainBuilder(log);
  37. if (opts.babelrc !== false) {
  38. builder.findConfigs(filename);
  39. }
  40. builder.mergeConfig({
  41. options: opts,
  42. alias: "base",
  43. dirname: filename && _path2.default.dirname(filename)
  44. });
  45. return builder.configs;
  46. }
  47. var ConfigChainBuilder = function () {
  48. function ConfigChainBuilder(log) {
  49. (0, _classCallCheck3.default)(this, ConfigChainBuilder);
  50. this.resolvedConfigs = [];
  51. this.configs = [];
  52. this.log = log;
  53. }
  54. ConfigChainBuilder.prototype.findConfigs = function findConfigs(loc) {
  55. if (!loc) return;
  56. if (!(0, _pathIsAbsolute2.default)(loc)) {
  57. loc = _path2.default.join(process.cwd(), loc);
  58. }
  59. var foundConfig = false;
  60. var foundIgnore = false;
  61. while (loc !== (loc = _path2.default.dirname(loc))) {
  62. if (!foundConfig) {
  63. var configLoc = _path2.default.join(loc, BABELRC_FILENAME);
  64. if (exists(configLoc)) {
  65. this.addConfig(configLoc);
  66. foundConfig = true;
  67. }
  68. var pkgLoc = _path2.default.join(loc, PACKAGE_FILENAME);
  69. if (!foundConfig && exists(pkgLoc)) {
  70. foundConfig = this.addConfig(pkgLoc, "babel", JSON);
  71. }
  72. }
  73. if (!foundIgnore) {
  74. var ignoreLoc = _path2.default.join(loc, BABELIGNORE_FILENAME);
  75. if (exists(ignoreLoc)) {
  76. this.addIgnoreConfig(ignoreLoc);
  77. foundIgnore = true;
  78. }
  79. }
  80. if (foundIgnore && foundConfig) return;
  81. }
  82. };
  83. ConfigChainBuilder.prototype.addIgnoreConfig = function addIgnoreConfig(loc) {
  84. var file = _fs2.default.readFileSync(loc, "utf8");
  85. var lines = file.split("\n");
  86. lines = lines.map(function (line) {
  87. return line.replace(/#(.*?)$/, "").trim();
  88. }).filter(function (line) {
  89. return !!line;
  90. });
  91. if (lines.length) {
  92. this.mergeConfig({
  93. options: { ignore: lines },
  94. alias: loc,
  95. dirname: _path2.default.dirname(loc)
  96. });
  97. }
  98. };
  99. ConfigChainBuilder.prototype.addConfig = function addConfig(loc, key) {
  100. var json = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _json2.default;
  101. if (this.resolvedConfigs.indexOf(loc) >= 0) {
  102. return false;
  103. }
  104. this.resolvedConfigs.push(loc);
  105. var content = _fs2.default.readFileSync(loc, "utf8");
  106. var options = void 0;
  107. try {
  108. options = jsonCache[content] = jsonCache[content] || json.parse(content);
  109. if (key) options = options[key];
  110. } catch (err) {
  111. err.message = loc + ": Error while parsing JSON - " + err.message;
  112. throw err;
  113. }
  114. this.mergeConfig({
  115. options: options,
  116. alias: loc,
  117. dirname: _path2.default.dirname(loc)
  118. });
  119. return !!options;
  120. };
  121. ConfigChainBuilder.prototype.mergeConfig = function mergeConfig(_ref) {
  122. var options = _ref.options,
  123. alias = _ref.alias,
  124. loc = _ref.loc,
  125. dirname = _ref.dirname;
  126. if (!options) {
  127. return false;
  128. }
  129. options = (0, _assign2.default)({}, options);
  130. dirname = dirname || process.cwd();
  131. loc = loc || alias;
  132. if (options.extends) {
  133. var extendsLoc = (0, _resolve2.default)(options.extends, dirname);
  134. if (extendsLoc) {
  135. this.addConfig(extendsLoc);
  136. } else {
  137. if (this.log) this.log.error("Couldn't resolve extends clause of " + options.extends + " in " + alias);
  138. }
  139. delete options.extends;
  140. }
  141. this.configs.push({
  142. options: options,
  143. alias: alias,
  144. loc: loc,
  145. dirname: dirname
  146. });
  147. var envOpts = void 0;
  148. var envKey = process.env.BABEL_ENV || process.env.NODE_ENV || "development";
  149. if (options.env) {
  150. envOpts = options.env[envKey];
  151. delete options.env;
  152. }
  153. this.mergeConfig({
  154. options: envOpts,
  155. alias: alias + ".env." + envKey,
  156. dirname: dirname
  157. });
  158. };
  159. return ConfigChainBuilder;
  160. }();
  161. module.exports = exports["default"];