index.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', {
  3. value: true
  4. });
  5. exports.DependencyResolver = void 0;
  6. function path() {
  7. const data = _interopRequireWildcard(require('path'));
  8. path = function () {
  9. return data;
  10. };
  11. return data;
  12. }
  13. function _jestSnapshot() {
  14. const data = require('jest-snapshot');
  15. _jestSnapshot = function () {
  16. return data;
  17. };
  18. return data;
  19. }
  20. function _getRequireWildcardCache(nodeInterop) {
  21. if (typeof WeakMap !== 'function') return null;
  22. var cacheBabelInterop = new WeakMap();
  23. var cacheNodeInterop = new WeakMap();
  24. return (_getRequireWildcardCache = function (nodeInterop) {
  25. return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  26. })(nodeInterop);
  27. }
  28. function _interopRequireWildcard(obj, nodeInterop) {
  29. if (!nodeInterop && obj && obj.__esModule) {
  30. return obj;
  31. }
  32. if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
  33. return {default: obj};
  34. }
  35. var cache = _getRequireWildcardCache(nodeInterop);
  36. if (cache && cache.has(obj)) {
  37. return cache.get(obj);
  38. }
  39. var newObj = {};
  40. var hasPropertyDescriptor =
  41. Object.defineProperty && Object.getOwnPropertyDescriptor;
  42. for (var key in obj) {
  43. if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) {
  44. var desc = hasPropertyDescriptor
  45. ? Object.getOwnPropertyDescriptor(obj, key)
  46. : null;
  47. if (desc && (desc.get || desc.set)) {
  48. Object.defineProperty(newObj, key, desc);
  49. } else {
  50. newObj[key] = obj[key];
  51. }
  52. }
  53. }
  54. newObj.default = obj;
  55. if (cache) {
  56. cache.set(obj, newObj);
  57. }
  58. return newObj;
  59. }
  60. /**
  61. * Copyright (c) Meta Platforms, Inc. and affiliates.
  62. *
  63. * This source code is licensed under the MIT license found in the
  64. * LICENSE file in the root directory of this source tree.
  65. */
  66. /**
  67. * DependencyResolver is used to resolve the direct dependencies of a module or
  68. * to retrieve a list of all transitive inverse dependencies.
  69. */
  70. class DependencyResolver {
  71. _hasteFS;
  72. _resolver;
  73. _snapshotResolver;
  74. constructor(resolver, hasteFS, snapshotResolver) {
  75. this._resolver = resolver;
  76. this._hasteFS = hasteFS;
  77. this._snapshotResolver = snapshotResolver;
  78. }
  79. resolve(file, options) {
  80. const dependencies = this._hasteFS.getDependencies(file);
  81. if (!dependencies) {
  82. return [];
  83. }
  84. return dependencies.reduce((acc, dependency) => {
  85. if (this._resolver.isCoreModule(dependency)) {
  86. return acc;
  87. }
  88. let resolvedDependency;
  89. let resolvedMockDependency;
  90. try {
  91. resolvedDependency = this._resolver.resolveModule(
  92. file,
  93. dependency,
  94. options
  95. );
  96. } catch {
  97. try {
  98. resolvedDependency = this._resolver.getMockModule(file, dependency);
  99. } catch {
  100. // leave resolvedDependency as undefined if nothing can be found
  101. }
  102. }
  103. if (resolvedDependency == null) {
  104. return acc;
  105. }
  106. acc.push(resolvedDependency);
  107. // If we resolve a dependency, then look for a mock dependency
  108. // of the same name in that dependency's directory.
  109. try {
  110. resolvedMockDependency = this._resolver.getMockModule(
  111. resolvedDependency,
  112. path().basename(dependency)
  113. );
  114. } catch {
  115. // leave resolvedMockDependency as undefined if nothing can be found
  116. }
  117. if (resolvedMockDependency != null) {
  118. const dependencyMockDir = path().resolve(
  119. path().dirname(resolvedDependency),
  120. '__mocks__'
  121. );
  122. resolvedMockDependency = path().resolve(resolvedMockDependency);
  123. // make sure mock is in the correct directory
  124. if (dependencyMockDir === path().dirname(resolvedMockDependency)) {
  125. acc.push(resolvedMockDependency);
  126. }
  127. }
  128. return acc;
  129. }, []);
  130. }
  131. resolveInverseModuleMap(paths, filter, options) {
  132. if (!paths.size) {
  133. return [];
  134. }
  135. const collectModules = (related, moduleMap, changed) => {
  136. const visitedModules = new Set();
  137. const result = [];
  138. while (changed.size) {
  139. changed = new Set(
  140. moduleMap.reduce((acc, module) => {
  141. if (
  142. visitedModules.has(module.file) ||
  143. !module.dependencies.some(dep => changed.has(dep))
  144. ) {
  145. return acc;
  146. }
  147. const file = module.file;
  148. if (filter(file)) {
  149. result.push(module);
  150. related.delete(file);
  151. }
  152. visitedModules.add(file);
  153. acc.push(file);
  154. return acc;
  155. }, [])
  156. );
  157. }
  158. return result.concat(
  159. Array.from(related).map(file => ({
  160. dependencies: [],
  161. file
  162. }))
  163. );
  164. };
  165. const relatedPaths = new Set();
  166. const changed = new Set();
  167. for (const path of paths) {
  168. if (this._hasteFS.exists(path)) {
  169. const modulePath = (0, _jestSnapshot().isSnapshotPath)(path)
  170. ? this._snapshotResolver.resolveTestPath(path)
  171. : path;
  172. changed.add(modulePath);
  173. if (filter(modulePath)) {
  174. relatedPaths.add(modulePath);
  175. }
  176. }
  177. }
  178. const modules = [];
  179. for (const file of this._hasteFS.getAbsoluteFileIterator()) {
  180. modules.push({
  181. dependencies: this.resolve(file, options),
  182. file
  183. });
  184. }
  185. return collectModules(relatedPaths, modules, changed);
  186. }
  187. resolveInverse(paths, filter, options) {
  188. return this.resolveInverseModuleMap(paths, filter, options).map(
  189. module => module.file
  190. );
  191. }
  192. }
  193. exports.DependencyResolver = DependencyResolver;