You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							179 lines
						
					
					
						
							5.3 KiB
						
					
					
				
			
		
		
	
	
							179 lines
						
					
					
						
							5.3 KiB
						
					
					
				'use strict'; | 
						|
 | 
						|
var path = require('path'); | 
						|
var fs = require('fs'); | 
						|
var JSON5 = require('json5'); | 
						|
var pathExists = require('path-exists'); | 
						|
 | 
						|
var INFINITY = 1 / 0; | 
						|
var BABELRC_FILENAME = '.babelrc'; | 
						|
var BABELRC_JS_FILENAME = '.babelrc.js'; | 
						|
var BABEL_CONFIG_JS_FILENAME = 'babel.config.js'; | 
						|
var PACKAGE_FILENAME = 'package.json'; | 
						|
 | 
						|
var nullConf = { file: null, config: null }; | 
						|
 | 
						|
function getBabelJsConfig(file) { | 
						|
    // eslint-disable-next-line global-require, import/no-dynamic-require | 
						|
    var configModule = require(file); | 
						|
 | 
						|
    if (typeof configModule === 'function') { | 
						|
        return configModule(); | 
						|
    } | 
						|
 | 
						|
    // eslint-disable-next-line no-underscore-dangle | 
						|
    return configModule && configModule.__esModule ? configModule.default : configModule; | 
						|
} | 
						|
 | 
						|
function asyncFind(resolve, dir, depth) { | 
						|
    if (depth < 0) { | 
						|
        return resolve(nullConf); | 
						|
    } | 
						|
 | 
						|
    var babelrc = path.join(dir, BABELRC_FILENAME); | 
						|
    return pathExists(babelrc).then(function (exists) { | 
						|
        if (exists) { | 
						|
            fs.readFile(babelrc, 'utf8', function (err, data) { | 
						|
                if (!err) { | 
						|
                    resolve({ | 
						|
                        file: babelrc, | 
						|
                        config: JSON5.parse(data) | 
						|
                    }); | 
						|
                } | 
						|
            }); | 
						|
        } | 
						|
        return exists; | 
						|
    }).then(function (exists) { | 
						|
        if (!exists) { | 
						|
            var babelJSrc = path.join(dir, BABELRC_JS_FILENAME); | 
						|
            return pathExists(babelJSrc).then(function (ex) { | 
						|
                if (ex) { | 
						|
                    var config = getBabelJsConfig(babelJSrc); | 
						|
                    resolve({ | 
						|
                        file: babelJSrc, | 
						|
                        config | 
						|
                    }); | 
						|
                } | 
						|
            }); | 
						|
        } | 
						|
        return exists; | 
						|
    }).then(function (exists) { | 
						|
        if (!exists) { | 
						|
            var packageFile = path.join(dir, PACKAGE_FILENAME); | 
						|
            return pathExists(packageFile).then(function (ex) { | 
						|
                if (ex) { | 
						|
                    fs.readFile(packageFile, 'utf8', function (err, data) { | 
						|
                        var packageJson = JSON.parse(data); | 
						|
                        if (packageJson.babel) { | 
						|
                            resolve({ | 
						|
                                file: packageFile, | 
						|
                                config: packageJson.babel | 
						|
                            }); | 
						|
                        } | 
						|
                    }); | 
						|
                } | 
						|
            }); | 
						|
        } | 
						|
        return exists; | 
						|
    }).then(function (exists) { | 
						|
        if (!exists) { | 
						|
            var babelConfigJSrc = path.join(dir, BABEL_CONFIG_JS_FILENAME); | 
						|
            return pathExists(babelConfigJSrc).then(function (ex) { | 
						|
                if (ex) { | 
						|
                    var config = getBabelJsConfig(babelConfigJSrc); | 
						|
                    resolve({ | 
						|
                        file: babelConfigJSrc, | 
						|
                        config | 
						|
                    }); | 
						|
                } | 
						|
            }); | 
						|
        } | 
						|
        return exists; | 
						|
    }).then(function (exists) { | 
						|
        if (!exists) { | 
						|
            var nextDir = path.dirname(dir); | 
						|
            if (nextDir === dir) { | 
						|
                resolve(nullConf); | 
						|
            } else { | 
						|
                asyncFind(resolve, nextDir, depth - 1); | 
						|
            } | 
						|
        } | 
						|
    }); | 
						|
} | 
						|
 | 
						|
module.exports = function findBabelConfig(start) { | 
						|
    var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : INFINITY; | 
						|
 | 
						|
    if (!start) { | 
						|
        return new Promise(function (resolve) { | 
						|
            return resolve(nullConf); | 
						|
        }); | 
						|
    } | 
						|
 | 
						|
    var dir = path.isAbsolute(start) ? start : path.join(process.cwd(), start); | 
						|
 | 
						|
    return new Promise(function (resolve) { | 
						|
        asyncFind(resolve, dir, depth); | 
						|
    }); | 
						|
}; | 
						|
 | 
						|
module.exports.sync = function findBabelConfigSync(start) { | 
						|
    var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : INFINITY; | 
						|
 | 
						|
    if (!start) { | 
						|
        return nullConf; | 
						|
    } | 
						|
 | 
						|
    var dir = path.isAbsolute(start) ? start : path.join(process.cwd(), start); | 
						|
    var loopLeft = depth; | 
						|
 | 
						|
    // eslint-disable-next-line no-cond-assign | 
						|
    do { | 
						|
        var babelrc = path.join(dir, BABELRC_FILENAME); | 
						|
        if (pathExists.sync(babelrc)) { | 
						|
            var babelrcContent = fs.readFileSync(babelrc, 'utf8'); | 
						|
            return { | 
						|
                file: babelrc, | 
						|
                config: JSON5.parse(babelrcContent) | 
						|
            }; | 
						|
        } | 
						|
 | 
						|
        var babelJSrc = path.join(dir, BABELRC_JS_FILENAME); | 
						|
        if (pathExists.sync(babelJSrc)) { | 
						|
            var config = getBabelJsConfig(babelJSrc); | 
						|
            return { | 
						|
                file: babelJSrc, | 
						|
                config | 
						|
            }; | 
						|
        } | 
						|
 | 
						|
        var babelConfigJSrc = path.join(dir, BABEL_CONFIG_JS_FILENAME); | 
						|
        if (pathExists.sync(babelConfigJSrc)) { | 
						|
            var _config = getBabelJsConfig(babelConfigJSrc); | 
						|
            return { | 
						|
                file: babelConfigJSrc, | 
						|
                config: _config | 
						|
            }; | 
						|
        } | 
						|
 | 
						|
        var packageFile = path.join(dir, PACKAGE_FILENAME); | 
						|
        if (pathExists.sync(packageFile)) { | 
						|
            var packageContent = fs.readFileSync(packageFile, 'utf8'); | 
						|
            var packageJson = JSON.parse(packageContent); | 
						|
            if (packageJson.babel) { | 
						|
                return { | 
						|
                    file: packageFile, | 
						|
                    config: packageJson.babel | 
						|
                }; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        if (loopLeft === 0) { | 
						|
            return nullConf; | 
						|
        } | 
						|
 | 
						|
        loopLeft -= 1; | 
						|
    } while (dir !== (dir = path.dirname(dir))); | 
						|
 | 
						|
    return nullConf; | 
						|
}; |