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
 |