You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					142 lines
				
				3.4 KiB
			
		
		
			
		
	
	
					142 lines
				
				3.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"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
							 |