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.
		
		
		
		
			
				
					205 lines
				
				4.7 KiB
			
		
		
			
		
	
	
					205 lines
				
				4.7 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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(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;
							 |