142 lines
3.4 KiB
JavaScript
142 lines
3.4 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.ExplorerBase = void 0;
|
|
exports.getExtensionDescription = getExtensionDescription;
|
|
|
|
var _path = _interopRequireDefault(require("path"));
|
|
|
|
var _loaders = require("./loaders");
|
|
|
|
var _getPropertyByPath = require("./getPropertyByPath");
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
class ExplorerBase {
|
|
constructor(options) {
|
|
if (options.cache === true) {
|
|
this.loadCache = new Map();
|
|
this.searchCache = new Map();
|
|
}
|
|
|
|
this.config = options;
|
|
this.validateConfig();
|
|
}
|
|
|
|
clearLoadCache() {
|
|
if (this.loadCache) {
|
|
this.loadCache.clear();
|
|
}
|
|
}
|
|
|
|
clearSearchCache() {
|
|
if (this.searchCache) {
|
|
this.searchCache.clear();
|
|
}
|
|
}
|
|
|
|
clearCaches() {
|
|
this.clearLoadCache();
|
|
this.clearSearchCache();
|
|
}
|
|
|
|
validateConfig() {
|
|
const config = this.config;
|
|
config.searchPlaces.forEach(place => {
|
|
const loaderKey = _path.default.extname(place) || 'noExt';
|
|
const loader = config.loaders[loaderKey];
|
|
|
|
if (!loader) {
|
|
throw new Error(`No loader specified for ${getExtensionDescription(place)}, so searchPlaces item "${place}" is invalid`);
|
|
}
|
|
|
|
if (typeof loader !== 'function') {
|
|
throw new Error(`loader for ${getExtensionDescription(place)} is not a function (type provided: "${typeof loader}"), so searchPlaces item "${place}" is invalid`);
|
|
}
|
|
});
|
|
}
|
|
|
|
shouldSearchStopWithResult(result) {
|
|
if (result === null) return false;
|
|
if (result.isEmpty && this.config.ignoreEmptySearchPlaces) return false;
|
|
return true;
|
|
}
|
|
|
|
nextDirectoryToSearch(currentDir, currentResult) {
|
|
if (this.shouldSearchStopWithResult(currentResult)) {
|
|
return null;
|
|
}
|
|
|
|
const nextDir = nextDirUp(currentDir);
|
|
|
|
if (nextDir === currentDir || currentDir === this.config.stopDir) {
|
|
return null;
|
|
}
|
|
|
|
return nextDir;
|
|
}
|
|
|
|
loadPackageProp(filepath, content) {
|
|
const parsedContent = _loaders.loaders.loadJson(filepath, content);
|
|
|
|
const packagePropValue = (0, _getPropertyByPath.getPropertyByPath)(parsedContent, this.config.packageProp);
|
|
return packagePropValue || null;
|
|
}
|
|
|
|
getLoaderEntryForFile(filepath) {
|
|
if (_path.default.basename(filepath) === 'package.json') {
|
|
const loader = this.loadPackageProp.bind(this);
|
|
return loader;
|
|
}
|
|
|
|
const loaderKey = _path.default.extname(filepath) || 'noExt';
|
|
const loader = this.config.loaders[loaderKey];
|
|
|
|
if (!loader) {
|
|
throw new Error(`No loader specified for ${getExtensionDescription(filepath)}`);
|
|
}
|
|
|
|
return loader;
|
|
}
|
|
|
|
loadedContentToCosmiconfigResult(filepath, loadedContent) {
|
|
if (loadedContent === null) {
|
|
return null;
|
|
}
|
|
|
|
if (loadedContent === undefined) {
|
|
return {
|
|
filepath,
|
|
config: undefined,
|
|
isEmpty: true
|
|
};
|
|
}
|
|
|
|
return {
|
|
config: loadedContent,
|
|
filepath
|
|
};
|
|
}
|
|
|
|
validateFilePath(filepath) {
|
|
if (!filepath) {
|
|
throw new Error('load must pass a non-empty string');
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
exports.ExplorerBase = ExplorerBase;
|
|
|
|
function nextDirUp(dir) {
|
|
return _path.default.dirname(dir);
|
|
}
|
|
|
|
function getExtensionDescription(filepath) {
|
|
const ext = _path.default.extname(filepath);
|
|
|
|
return ext ? `extension "${ext}"` : 'files without extensions';
|
|
}
|
|
//# sourceMappingURL=ExplorerBase.js.map
|