| "use strict"; |
| var __importDefault = (this && this.__importDefault) || function (mod) { |
| return (mod && mod.__esModule) ? mod : { "default": mod }; |
| }; |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| exports.getExtensionDescription = exports.ExplorerBase = void 0; |
| const env_paths_1 = __importDefault(require("env-paths")); |
| const os_1 = __importDefault(require("os")); |
| const path_1 = __importDefault(require("path")); |
| const util_js_1 = require("./util.js"); |
| /** |
| * @internal |
| */ |
| class ExplorerBase { |
| #loadingMetaConfig = false; |
| config; |
| loadCache; |
| searchCache; |
| constructor(options) { |
| this.config = options; |
| if (options.cache) { |
| this.loadCache = new Map(); |
| this.searchCache = new Map(); |
| } |
| this.#validateConfig(); |
| } |
| set loadingMetaConfig(value) { |
| this.#loadingMetaConfig = value; |
| } |
| #validateConfig() { |
| const config = this.config; |
| for (const place of config.searchPlaces) { |
| const extension = path_1.default.extname(place); |
| const loader = this.config.loaders[extension || 'noExt'] ?? |
| this.config.loaders['default']; |
| if (loader === undefined) { |
| throw new Error(`Missing loader for ${getExtensionDescription(place)}.`); |
| } |
| if (typeof loader !== 'function') { |
| throw new Error(`Loader for ${getExtensionDescription(place)} is not a function: Received ${typeof loader}.`); |
| } |
| } |
| } |
| clearLoadCache() { |
| if (this.loadCache) { |
| this.loadCache.clear(); |
| } |
| } |
| clearSearchCache() { |
| if (this.searchCache) { |
| this.searchCache.clear(); |
| } |
| } |
| clearCaches() { |
| this.clearLoadCache(); |
| this.clearSearchCache(); |
| } |
| toCosmiconfigResult(filepath, config) { |
| if (config === null) { |
| return null; |
| } |
| if (config === undefined) { |
| return { filepath, config: undefined, isEmpty: true }; |
| } |
| if (this.config.applyPackagePropertyPathToConfiguration || |
| this.#loadingMetaConfig) { |
| const packageProp = this.config.packageProp ?? this.config.moduleName; |
| config = (0, util_js_1.getPropertyByPath)(config, packageProp); |
| } |
| if (config === undefined) { |
| return { filepath, config: undefined, isEmpty: true }; |
| } |
| return { config, filepath }; |
| } |
| validateImports(containingFilePath, imports, importStack) { |
| const fileDirectory = path_1.default.dirname(containingFilePath); |
| for (const importPath of imports) { |
| if (typeof importPath !== 'string') { |
| throw new Error(`${containingFilePath}: Key $import must contain a string or a list of strings`); |
| } |
| const fullPath = path_1.default.resolve(fileDirectory, importPath); |
| if (fullPath === containingFilePath) { |
| throw new Error(`Self-import detected in ${containingFilePath}`); |
| } |
| const idx = importStack.indexOf(fullPath); |
| if (idx !== -1) { |
| throw new Error(`Circular import detected: |
| ${[...importStack, fullPath] |
| .map((path, i) => `${i + 1}. ${path}`) |
| .join('\n')} (same as ${idx + 1}.)`); |
| } |
| } |
| } |
| getSearchPlacesForDir(dir, globalConfigPlaces) { |
| return (dir.isGlobalConfig ? globalConfigPlaces : this.config.searchPlaces).map((place) => path_1.default.join(dir.path, place)); |
| } |
| getGlobalConfigDir() { |
| return (0, env_paths_1.default)(this.config.moduleName, { suffix: '' }).config; |
| } |
| *getGlobalDirs(startDir) { |
| const stopDir = path_1.default.resolve(this.config.stopDir ?? os_1.default.homedir()); |
| yield { path: startDir, isGlobalConfig: false }; |
| let currentDir = startDir; |
| while (currentDir !== stopDir) { |
| const parentDir = path_1.default.dirname(currentDir); |
| /* istanbul ignore if -- @preserve */ |
| if (parentDir === currentDir) { |
| // we're probably at the root of the directory structure |
| break; |
| } |
| yield { path: parentDir, isGlobalConfig: false }; |
| currentDir = parentDir; |
| } |
| yield { path: this.getGlobalConfigDir(), isGlobalConfig: true }; |
| } |
| } |
| exports.ExplorerBase = ExplorerBase; |
| /** |
| * @internal |
| */ |
| function getExtensionDescription(extension) { |
| /* istanbul ignore next -- @preserve */ |
| return extension ? `extension "${extension}"` : 'files without extensions'; |
| } |
| exports.getExtensionDescription = getExtensionDescription; |
| //# sourceMappingURL=ExplorerBase.js.map |