"use strict";
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
};
|
Object.defineProperty(exports, "__esModule", { value: true });
|
exports.ExplorerSync = void 0;
|
const fs_1 = __importDefault(require("fs"));
|
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 ExplorerSync extends ExplorerBase_js_1.ExplorerBase {
|
load(filepath) {
|
filepath = path_1.default.resolve(filepath);
|
const load = () => {
|
return this.config.transform(this.#readConfiguration(filepath));
|
};
|
if (this.loadCache) {
|
return (0, util_js_1.emplace)(this.loadCache, filepath, load);
|
}
|
return load();
|
}
|
search(from = '') {
|
if (this.config.metaConfigFilePath) {
|
this.loadingMetaConfig = true;
|
const config = 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 = 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 = () => {
|
/* istanbul ignore if -- @preserve */
|
if ((0, util_js_1.isDirectorySync)(currentDir.path)) {
|
for (const filepath of this.getSearchPlacesForDir(currentDir, defaults_1.globalConfigSearchPlacesSync)) {
|
try {
|
const result = this.#readConfiguration(filepath);
|
if (result !== null &&
|
!(result.isEmpty && this.config.ignoreEmptySearchPlaces)) {
|
return this.config.transform(result);
|
}
|
}
|
catch (error) {
|
if (error.code === 'ENOENT' ||
|
error.code === 'EISDIR' ||
|
error.code === 'ENOTDIR' ||
|
error.code === 'EACCES') {
|
continue;
|
}
|
throw error;
|
}
|
}
|
}
|
const nextDirIter = dirs.next();
|
if (!nextDirIter.done) {
|
currentDir = nextDirIter.value;
|
if (this.searchCache) {
|
return (0, util_js_1.emplace)(this.searchCache, currentDir.path, search);
|
}
|
return search();
|
}
|
return this.config.transform(null);
|
};
|
if (this.searchCache) {
|
return (0, util_js_1.emplace)(this.searchCache, from, search);
|
}
|
return search();
|
}
|
#readConfiguration(filepath, importStack = []) {
|
const contents = fs_1.default.readFileSync(filepath, 'utf8');
|
return this.toCosmiconfigResult(filepath, this.#loadConfigFileWithImports(filepath, contents, importStack));
|
}
|
#loadConfigFileWithImports(filepath, contents, importStack) {
|
const loadedContent = 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 = importPaths.map((importPath) => {
|
const fullPath = path_1.default.resolve(fileDirectory, importPath);
|
const result = this.#readConfiguration(fullPath, newImportStack);
|
return result?.config;
|
});
|
return (0, merge_1.mergeAll)([...importedConfigs, ownContent], {
|
mergeArrays: this.config.mergeImportArrays,
|
});
|
}
|
#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 = 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;
|
}
|
}
|
#fileExists(path) {
|
try {
|
fs_1.default.statSync(path);
|
return true;
|
}
|
catch (e) {
|
return false;
|
}
|
}
|
*#getDirs(startDir) {
|
switch (this.config.searchStrategy) {
|
case 'none': {
|
// there is no next dir
|
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 (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);
|
}
|
}
|
}
|
/**
|
* @deprecated Use {@link ExplorerSync.prototype.load}.
|
*/
|
/* istanbul ignore next */
|
loadSync(filepath) {
|
return this.load(filepath);
|
}
|
/**
|
* @deprecated Use {@link ExplorerSync.prototype.search}.
|
*/
|
/* istanbul ignore next */
|
searchSync(from = '') {
|
return this.search(from);
|
}
|
}
|
exports.ExplorerSync = ExplorerSync;
|
//# sourceMappingURL=ExplorerSync.js.map
|