index.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. 'use strict';
  2. var path = require('path');
  3. var fs = require('fs');
  4. var JSON5 = require('json5');
  5. var pathExists = require('path-exists');
  6. var INFINITY = 1 / 0;
  7. var BABELRC_FILENAME = '.babelrc';
  8. var BABELRC_JS_FILENAME = '.babelrc.js';
  9. var PACKAGE_FILENAME = 'package.json';
  10. var nullConf = { file: null, config: null };
  11. function getBabelJsConfig(file) {
  12. // eslint-disable-next-line global-require, import/no-dynamic-require
  13. var configModule = require(file);
  14. // eslint-disable-next-line no-underscore-dangle
  15. return configModule && configModule.__esModule ? configModule.default : configModule;
  16. }
  17. function asyncFind(resolve, dir, depth) {
  18. if (depth < 0) {
  19. return resolve(nullConf);
  20. }
  21. var babelrc = path.join(dir, BABELRC_FILENAME);
  22. return pathExists(babelrc).then(function (exists) {
  23. if (exists) {
  24. fs.readFile(babelrc, 'utf8', function (err, data) {
  25. if (!err) {
  26. resolve({
  27. file: babelrc,
  28. config: JSON5.parse(data)
  29. });
  30. }
  31. });
  32. }
  33. return exists;
  34. }).then(function (exists) {
  35. if (!exists) {
  36. var babelJSrc = path.join(dir, BABELRC_JS_FILENAME);
  37. return pathExists(babelJSrc).then(function (ex) {
  38. if (ex) {
  39. var config = getBabelJsConfig(babelJSrc);
  40. resolve({
  41. file: babelJSrc,
  42. config
  43. });
  44. }
  45. });
  46. }
  47. return exists;
  48. }).then(function (exists) {
  49. if (!exists) {
  50. var packageFile = path.join(dir, PACKAGE_FILENAME);
  51. return pathExists(packageFile).then(function (ex) {
  52. if (ex) {
  53. fs.readFile(packageFile, 'utf8', function (err, data) {
  54. var packageJson = JSON.parse(data);
  55. if (packageJson.babel) {
  56. resolve({
  57. file: packageFile,
  58. config: packageJson.babel
  59. });
  60. }
  61. });
  62. }
  63. });
  64. }
  65. return exists;
  66. }).then(function (exists) {
  67. if (!exists) {
  68. var nextDir = path.dirname(dir);
  69. if (nextDir === dir) {
  70. resolve(nullConf);
  71. } else {
  72. asyncFind(resolve, nextDir, depth - 1);
  73. }
  74. }
  75. });
  76. }
  77. module.exports = function findBabelConfig(start) {
  78. var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : INFINITY;
  79. if (!start) {
  80. return new Promise(function (resolve) {
  81. return resolve(nullConf);
  82. });
  83. }
  84. var dir = path.isAbsolute(start) ? start : path.join(process.cwd(), start);
  85. return new Promise(function (resolve) {
  86. asyncFind(resolve, dir, depth);
  87. });
  88. };
  89. module.exports.sync = function findBabelConfigSync(start) {
  90. var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : INFINITY;
  91. if (!start) {
  92. return nullConf;
  93. }
  94. var dir = path.isAbsolute(start) ? start : path.join(process.cwd(), start);
  95. var loopLeft = depth;
  96. // eslint-disable-next-line no-cond-assign
  97. do {
  98. var babelrc = path.join(dir, BABELRC_FILENAME);
  99. if (pathExists.sync(babelrc)) {
  100. var babelrcContent = fs.readFileSync(babelrc, 'utf8');
  101. return {
  102. file: babelrc,
  103. config: JSON5.parse(babelrcContent)
  104. };
  105. }
  106. var babelJSrc = path.join(dir, BABELRC_JS_FILENAME);
  107. if (pathExists.sync(babelJSrc)) {
  108. var config = getBabelJsConfig(babelJSrc);
  109. return {
  110. file: babelJSrc,
  111. config
  112. };
  113. }
  114. var packageFile = path.join(dir, PACKAGE_FILENAME);
  115. if (pathExists.sync(packageFile)) {
  116. var packageContent = fs.readFileSync(packageFile, 'utf8');
  117. var packageJson = JSON.parse(packageContent);
  118. if (packageJson.babel) {
  119. return {
  120. file: packageFile,
  121. config: packageJson.babel
  122. };
  123. }
  124. }
  125. if (loopLeft === 0) {
  126. return nullConf;
  127. }
  128. loopLeft -= 1;
  129. } while (dir !== (dir = path.dirname(dir)));
  130. return nullConf;
  131. };