UNPKG

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