"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ROOT_CONFIG_FILENAMES = void 0; exports.findConfigUpwards = findConfigUpwards; exports.findRelativeConfig = findRelativeConfig; exports.findRootConfig = findRootConfig; exports.loadConfig = loadConfig; exports.resolveShowConfigPath = resolveShowConfigPath; function _debug() { const data = require("debug"); _debug = function () { return data; }; return data; } function _fs() { const data = require("fs"); _fs = function () { return data; }; return data; } function _path() { const data = require("path"); _path = function () { return data; }; return data; } function _json() { const data = require("json5"); _json = function () { return data; }; return data; } function _gensync() { const data = require("gensync"); _gensync = function () { return data; }; return data; } var _caching = require("../caching.js"); var _configApi = require("../helpers/config-api.js"); var _utils = require("./utils.js"); var _moduleTypes = require("./module-types.js"); var _patternToRegex = require("../pattern-to-regex.js"); var _configError = require("../../errors/config-error.js"); var fs = require("../../gensync-utils/fs.js"); var _rewriteStackTrace = require("../../errors/rewrite-stack-trace.js"); const debug = _debug()("babel:config:loading:files:configuration"); const ROOT_CONFIG_FILENAMES = exports.ROOT_CONFIG_FILENAMES = ["babel.config.js", "babel.config.cjs", "babel.config.mjs", "babel.config.json", "babel.config.cts"]; const RELATIVE_CONFIG_FILENAMES = [".babelrc", ".babelrc.js", ".babelrc.cjs", ".babelrc.mjs", ".babelrc.json", ".babelrc.cts"]; const BABELIGNORE_FILENAME = ".babelignore"; const runConfig = (0, _caching.makeWeakCache)(function* runConfig(options, cache) { yield* []; return { options: (0, _rewriteStackTrace.endHiddenCallStack)(options)((0, _configApi.makeConfigAPI)(cache)), cacheNeedsConfiguration: !cache.configured() }; }); function* readConfigCode(filepath, data) { if (!_fs().existsSync(filepath)) return null; let options = yield* (0, _moduleTypes.default)(filepath, "You appear to be using a native ECMAScript module configuration " + "file, which is only supported when running Babel asynchronously."); let cacheNeedsConfiguration = false; if (typeof options === "function") { ({ options, cacheNeedsConfiguration } = yield* runConfig(options, data)); } if (!options || typeof options !== "object" || Array.isArray(options)) { throw new _configError.default(`Configuration should be an exported JavaScript object.`, filepath); } if (typeof options.then === "function") { options.catch == null || options.catch(() => {}); throw new _configError.default(`You appear to be using an async configuration, ` + `which your current version of Babel does not support. ` + `We may add support for this in the future, ` + `but if you're on the most recent version of @babel/core and still ` + `seeing this error, then you'll need to synchronously return your config.`, filepath); } if (cacheNeedsConfiguration) throwConfigError(filepath); return buildConfigFileObject(options, filepath); } const cfboaf = new WeakMap(); function buildConfigFileObject(options, filepath) { let configFilesByFilepath = cfboaf.get(options); if (!configFilesByFilepath) { cfboaf.set(options, configFilesByFilepath = new Map()); } let configFile = configFilesByFilepath.get(filepath); if (!configFile) { configFile = { filepath, dirname: _path().dirname(filepath), options }; configFilesByFilepath.set(filepath, configFile); } return configFile; } const packageToBabelConfig = (0, _caching.makeWeakCacheSync)(file => { const babel = file.options["babel"]; if (typeof babel === "undefined") return null; if (typeof babel !== "object" || Array.isArray(babel) || babel === null) { throw new _configError.default(`.babel property must be an object`, file.filepath); } return { filepath: file.filepath, dirname: file.dirname, options: babel }; }); const readConfigJSON5 = (0, _utils.makeStaticFileCache)((filepath, content) => { let options; try { options = _json().parse(content); } catch (err) { throw new _configError.default(`Error while parsing config - ${err.message}`, filepath); } if (!options) throw new _configError.default(`No config detected`, filepath); if (typeof options !== "object") { throw new _configError.default(`Config returned typeof ${typeof options}`, filepath); } if (Array.isArray(options)) { throw new _configError.default(`Expected config object but found array`, filepath); } delete options["$schema"]; return { filepath, dirname: _path().dirname(filepath), options }; }); const readIgnoreConfig = (0, _utils.makeStaticFileCache)((filepath, content) => { const ignoreDir = _path().dirname(filepath); const ignorePatterns = content.split("\n").map(line => line.replace(/#(.*?)$/, "").trim()).filter(line => !!line); for (const pattern of ignorePatterns) { if (pattern[0] === "!") { throw new _configError.default(`Negation of file paths is not supported.`, filepath); } } return { filepath, dirname: _path().dirname(filepath), ignore: ignorePatterns.map(pattern => (0, _patternToRegex.default)(pattern, ignoreDir)) }; }); function findConfigUpwards(rootDir) { let dirname = rootDir; for (;;) { for (const filename of ROOT_CONFIG_FILENAMES) { if (_fs().existsSync(_path().join(dirname, filename))) { return dirname; } } const nextDir = _path().dirname(dirname); if (dirname === nextDir) break; dirname = nextDir; } return null; } function* findRelativeConfig(packageData, envName, caller) { let config = null; let ignore = null; const dirname = _path().dirname(packageData.filepath); for (const loc of packageData.directories) { if (!config) { var _packageData$pkg; config = yield* loadOneConfig(RELATIVE_CONFIG_FILENAMES, loc, envName, caller, ((_packageData$pkg = packageData.pkg) == null ? void 0 : _packageData$pkg.dirname) === loc ? packageToBabelConfig(packageData.pkg) : null); } if (!ignore) { const ignoreLoc = _path().join(loc, BABELIGNORE_FILENAME); ignore = yield* readIgnoreConfig(ignoreLoc); if (ignore) { debug("Found ignore %o from %o.", ignore.filepath, dirname); } } } return { config, ignore }; } function findRootConfig(dirname, envName, caller) { return loadOneConfig(ROOT_CONFIG_FILENAMES, dirname, envName, caller); } function* loadOneConfig(names, dirname, envName, caller, previousConfig = null) { const configs = yield* _gensync().all(names.map(filename => readConfig(_path().join(dirname, filename), envName, caller))); const config = configs.reduce((previousConfig, config) => { if (config && previousConfig) { throw new _configError.default(`Multiple configuration files found. Please remove one:\n` + ` - ${_path().basename(previousConfig.filepath)}\n` + ` - ${config.filepath}\n` + `from ${dirname}`); } return config || previousConfig; }, previousConfig); if (config) { debug("Found configuration %o from %o.", config.filepath, dirname); } return config; } function* loadConfig(name, dirname, envName, caller) { const filepath = (((v, w) => (v = v.split("."), w = w.split("."), +v[0] > +w[0] || v[0] == w[0] && +v[1] >= +w[1]))(process.versions.node, "8.9") ? require.resolve : (r, { paths: [b] }, M = require("module")) => { let f = M._findPath(r, M._nodeModulePaths(b).concat(b)); if (f) return f; f = new Error(`Cannot resolve module '${r}'`); f.code = "MODULE_NOT_FOUND"; throw f; })(name, { paths: [dirname] }); const conf = yield* readConfig(filepath, envName, caller); if (!conf) { throw new _configError.default(`Config file contains no configuration data`, filepath); } debug("Loaded config %o from %o.", name, dirname); return conf; } function readConfig(filepath, envName, caller) { const ext = _path().extname(filepath); switch (ext) { case ".js": case ".cjs": case ".mjs": case ".cts": return readConfigCode(filepath, { envName, caller }); default: return readConfigJSON5(filepath); } } function* resolveShowConfigPath(dirname) { const targetPath = process.env.BABEL_SHOW_CONFIG_FOR; if (targetPath != null) { const absolutePath = _path().resolve(dirname, targetPath); const stats = yield* fs.stat(absolutePath); if (!stats.isFile()) { throw new Error(`${absolutePath}: BABEL_SHOW_CONFIG_FOR must refer to a regular file, directories are not supported.`); } return absolutePath; } return null; } function throwConfigError(filepath) { throw new _configError.default(`\ Caching was left unconfigured. Babel's plugins, presets, and .babelrc.js files can be configured for various types of caching, using the first param of their handler functions: module.exports = function(api) { // The API exposes the following: // Cache the returned value forever and don't call this function again. api.cache(true); // Don't cache at all. Not recommended because it will be very slow. api.cache(false); // Cached based on the value of some function. If this function returns a value different from // a previously-encountered value, the plugins will re-evaluate. var env = api.cache(() => process.env.NODE_ENV); // If testing for a specific env, we recommend specifics to avoid instantiating a plugin for // any possible NODE_ENV value that might come up during plugin execution. var isProd = api.cache(() => process.env.NODE_ENV === "production"); // .cache(fn) will perform a linear search though instances to find the matching plugin based // based on previous instantiated plugins. If you want to recreate the plugin and discard the // previous instance whenever something changes, you may use: var isProd = api.cache.invalidate(() => process.env.NODE_ENV === "production"); // Note, we also expose the following more-verbose versions of the above examples: api.cache.forever(); // api.cache(true) api.cache.never(); // api.cache(false) api.cache.using(fn); // api.cache(fn) // Return the value that will be cached. return { }; };`, filepath); } 0 && 0; //# sourceMappingURL=configuration.js.map