123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- "use strict";
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.Explorer = void 0;
- const promises_1 = __importDefault(require("fs/promises"));
- const path_1 = __importDefault(require("path"));
- const defaults_1 = require("./defaults");
- const ExplorerBase_js_1 = require("./ExplorerBase.js");
- const merge_1 = require("./merge");
- const util_js_1 = require("./util.js");
- /**
- * @internal
- */
- class Explorer extends ExplorerBase_js_1.ExplorerBase {
- async load(filepath) {
- filepath = path_1.default.resolve(filepath);
- const load = async () => {
- return await this.config.transform(await this.#readConfiguration(filepath));
- };
- if (this.loadCache) {
- return await (0, util_js_1.emplace)(this.loadCache, filepath, load);
- }
- return await load();
- }
- async search(from = '') {
- if (this.config.metaConfigFilePath) {
- this.loadingMetaConfig = true;
- const config = await this.load(this.config.metaConfigFilePath);
- this.loadingMetaConfig = false;
- if (config && !config.isEmpty) {
- return config;
- }
- }
- from = path_1.default.resolve(from);
- const dirs = this.#getDirs(from);
- const firstDirIter = await dirs.next();
- /* istanbul ignore if -- @preserve */
- if (firstDirIter.done) {
- // this should never happen
- throw new Error(`Could not find any folders to iterate through (start from ${from})`);
- }
- let currentDir = firstDirIter.value;
- const search = async () => {
- /* istanbul ignore if -- @preserve */
- if (await (0, util_js_1.isDirectory)(currentDir.path)) {
- for (const filepath of this.getSearchPlacesForDir(currentDir, defaults_1.globalConfigSearchPlaces)) {
- try {
- const result = await this.#readConfiguration(filepath);
- if (result !== null &&
- !(result.isEmpty && this.config.ignoreEmptySearchPlaces)) {
- return await this.config.transform(result);
- }
- }
- catch (error) {
- if (error.code === 'ENOENT' ||
- error.code === 'EISDIR' ||
- error.code === 'ENOTDIR' ||
- error.code === 'EACCES') {
- continue;
- }
- throw error;
- }
- }
- }
- const nextDirIter = await dirs.next();
- if (!nextDirIter.done) {
- currentDir = nextDirIter.value;
- if (this.searchCache) {
- return await (0, util_js_1.emplace)(this.searchCache, currentDir.path, search);
- }
- return await search();
- }
- return await this.config.transform(null);
- };
- if (this.searchCache) {
- return await (0, util_js_1.emplace)(this.searchCache, from, search);
- }
- return await search();
- }
- async #readConfiguration(filepath, importStack = []) {
- const contents = await promises_1.default.readFile(filepath, { encoding: 'utf-8' });
- return this.toCosmiconfigResult(filepath, await this.#loadConfigFileWithImports(filepath, contents, importStack));
- }
- async #loadConfigFileWithImports(filepath, contents, importStack) {
- const loadedContent = await this.#loadConfiguration(filepath, contents);
- if (!loadedContent || !(0, merge_1.hasOwn)(loadedContent, '$import')) {
- return loadedContent;
- }
- const fileDirectory = path_1.default.dirname(filepath);
- const { $import: imports, ...ownContent } = loadedContent;
- const importPaths = Array.isArray(imports) ? imports : [imports];
- const newImportStack = [...importStack, filepath];
- this.validateImports(filepath, importPaths, newImportStack);
- const importedConfigs = await Promise.all(importPaths.map(async (importPath) => {
- const fullPath = path_1.default.resolve(fileDirectory, importPath);
- const result = await this.#readConfiguration(fullPath, newImportStack);
- return result?.config;
- }));
- return (0, merge_1.mergeAll)([...importedConfigs, ownContent], {
- mergeArrays: this.config.mergeImportArrays,
- });
- }
- async #loadConfiguration(filepath, contents) {
- if (contents.trim() === '') {
- return;
- }
- const extension = path_1.default.extname(filepath);
- const loader = this.config.loaders[extension || 'noExt'] ??
- this.config.loaders['default'];
- if (!loader) {
- throw new Error(`No loader specified for ${(0, ExplorerBase_js_1.getExtensionDescription)(extension)}`);
- }
- try {
- const loadedContents = await loader(filepath, contents);
- if (path_1.default.basename(filepath, extension) !== 'package') {
- return loadedContents;
- }
- return ((0, util_js_1.getPropertyByPath)(loadedContents, this.config.packageProp ?? this.config.moduleName) ?? null);
- }
- catch (error) {
- error.filepath = filepath;
- throw error;
- }
- }
- async #fileExists(path) {
- try {
- await promises_1.default.stat(path);
- return true;
- }
- catch (e) {
- return false;
- }
- }
- async *#getDirs(startDir) {
- switch (this.config.searchStrategy) {
- case 'none': {
- // only check in the passed directory (defaults to working directory)
- yield { path: startDir, isGlobalConfig: false };
- return;
- }
- case 'project': {
- let currentDir = startDir;
- while (true) {
- yield { path: currentDir, isGlobalConfig: false };
- for (const ext of ['json', 'yaml']) {
- const packageFile = path_1.default.join(currentDir, `package.${ext}`);
- if (await this.#fileExists(packageFile)) {
- break;
- }
- }
- 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;
- }
- currentDir = parentDir;
- }
- return;
- }
- case 'global': {
- yield* this.getGlobalDirs(startDir);
- }
- }
- }
- }
- exports.Explorer = Explorer;
- //# sourceMappingURL=Explorer.js.map
|