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
			| 
								 
											4 years ago
										 
									 | 
							
								'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;
							 | 
						||
| 
								 | 
							
								};
							 |