205 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| function _jestSnapshot() {
 | |
|   const data = require('jest-snapshot');
 | |
| 
 | |
|   _jestSnapshot = function _jestSnapshot() {
 | |
|     return data;
 | |
|   };
 | |
| 
 | |
|   return data;
 | |
| }
 | |
| 
 | |
| function _defineProperty(obj, key, value) {
 | |
|   if (key in obj) {
 | |
|     Object.defineProperty(obj, key, {
 | |
|       value: value,
 | |
|       enumerable: true,
 | |
|       configurable: true,
 | |
|       writable: true
 | |
|     });
 | |
|   } else {
 | |
|     obj[key] = value;
 | |
|   }
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * DependencyResolver is used to resolve the direct dependencies of a module or
 | |
|  * to retrieve a list of all transitive inverse dependencies.
 | |
|  */
 | |
| 
 | |
| /* eslint-disable-next-line no-redeclare */
 | |
| class DependencyResolver {
 | |
|   constructor(resolver, hasteFS, snapshotResolver) {
 | |
|     _defineProperty(this, '_hasteFS', void 0);
 | |
| 
 | |
|     _defineProperty(this, '_resolver', void 0);
 | |
| 
 | |
|     _defineProperty(this, '_snapshotResolver', void 0);
 | |
| 
 | |
|     this._resolver = resolver;
 | |
|     this._hasteFS = hasteFS;
 | |
|     this._snapshotResolver = snapshotResolver;
 | |
|   }
 | |
| 
 | |
|   resolve(file, options) {
 | |
|     const dependencies = this._hasteFS.getDependencies(file);
 | |
| 
 | |
|     if (!dependencies) {
 | |
|       return [];
 | |
|     }
 | |
| 
 | |
|     return dependencies.reduce((acc, dependency) => {
 | |
|       if (this._resolver.isCoreModule(dependency)) {
 | |
|         return acc;
 | |
|       }
 | |
| 
 | |
|       let resolvedDependency;
 | |
| 
 | |
|       try {
 | |
|         resolvedDependency = this._resolver.resolveModule(
 | |
|           file,
 | |
|           dependency,
 | |
|           options
 | |
|         );
 | |
|       } catch (e) {
 | |
|         resolvedDependency = this._resolver.getMockModule(file, dependency);
 | |
|       }
 | |
| 
 | |
|       if (resolvedDependency) {
 | |
|         acc.push(resolvedDependency);
 | |
|       }
 | |
| 
 | |
|       return acc;
 | |
|     }, []);
 | |
|   }
 | |
| 
 | |
|   resolveInverseModuleMap(paths, filter, options) {
 | |
|     if (!paths.size) {
 | |
|       return [];
 | |
|     }
 | |
| 
 | |
|     const collectModules = (related, moduleMap, changed) => {
 | |
|       const visitedModules = new Set();
 | |
|       const result = [];
 | |
| 
 | |
|       while (changed.size) {
 | |
|         changed = new Set(
 | |
|           moduleMap.reduce((acc, module) => {
 | |
|             if (
 | |
|               visitedModules.has(module.file) ||
 | |
|               !module.dependencies.some(dep => changed.has(dep))
 | |
|             ) {
 | |
|               return acc;
 | |
|             }
 | |
| 
 | |
|             const file = module.file;
 | |
| 
 | |
|             if (filter(file)) {
 | |
|               result.push(module);
 | |
|               related.delete(file);
 | |
|             }
 | |
| 
 | |
|             visitedModules.add(file);
 | |
|             acc.push(module.file);
 | |
|             return acc;
 | |
|           }, [])
 | |
|         );
 | |
|       }
 | |
| 
 | |
|       return result.concat(
 | |
|         Array.from(related).map(file => ({
 | |
|           dependencies: [],
 | |
|           file
 | |
|         }))
 | |
|       );
 | |
|     };
 | |
| 
 | |
|     const relatedPaths = new Set();
 | |
|     const changed = new Set();
 | |
|     var _iteratorNormalCompletion = true;
 | |
|     var _didIteratorError = false;
 | |
|     var _iteratorError = undefined;
 | |
| 
 | |
|     try {
 | |
|       for (
 | |
|         var _iterator = paths[Symbol.iterator](), _step;
 | |
|         !(_iteratorNormalCompletion = (_step = _iterator.next()).done);
 | |
|         _iteratorNormalCompletion = true
 | |
|       ) {
 | |
|         const path = _step.value;
 | |
| 
 | |
|         if (this._hasteFS.exists(path)) {
 | |
|           const modulePath = (0, _jestSnapshot().isSnapshotPath)(path)
 | |
|             ? this._snapshotResolver.resolveTestPath(path)
 | |
|             : path;
 | |
|           changed.add(modulePath);
 | |
| 
 | |
|           if (filter(modulePath)) {
 | |
|             relatedPaths.add(modulePath);
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     } catch (err) {
 | |
|       _didIteratorError = true;
 | |
|       _iteratorError = err;
 | |
|     } finally {
 | |
|       try {
 | |
|         if (!_iteratorNormalCompletion && _iterator.return != null) {
 | |
|           _iterator.return();
 | |
|         }
 | |
|       } finally {
 | |
|         if (_didIteratorError) {
 | |
|           throw _iteratorError;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     const modules = [];
 | |
|     var _iteratorNormalCompletion2 = true;
 | |
|     var _didIteratorError2 = false;
 | |
|     var _iteratorError2 = undefined;
 | |
| 
 | |
|     try {
 | |
|       for (
 | |
|         var _iterator2 = this._hasteFS
 | |
|             .getAbsoluteFileIterator()
 | |
|             [Symbol.iterator](),
 | |
|           _step2;
 | |
|         !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done);
 | |
|         _iteratorNormalCompletion2 = true
 | |
|       ) {
 | |
|         const file = _step2.value;
 | |
|         modules.push({
 | |
|           dependencies: this.resolve(file, options),
 | |
|           file
 | |
|         });
 | |
|       }
 | |
|     } catch (err) {
 | |
|       _didIteratorError2 = true;
 | |
|       _iteratorError2 = err;
 | |
|     } finally {
 | |
|       try {
 | |
|         if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
 | |
|           _iterator2.return();
 | |
|         }
 | |
|       } finally {
 | |
|         if (_didIteratorError2) {
 | |
|           throw _iteratorError2;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return collectModules(relatedPaths, modules, changed);
 | |
|   }
 | |
| 
 | |
|   resolveInverse(paths, filter, options) {
 | |
|     return this.resolveInverseModuleMap(paths, filter, options).map(
 | |
|       module => module.file
 | |
|     );
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports = DependencyResolver;
 |