/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @flow * @format */ 'use strict'; /** * This is a subset of the actual `metro-bundler`'s `ResolutionResponse` class, * without all the stuff we don't need to know about. This allows us to use * `getInverseDependencies` with different versions of `metro-bundler`. */ export type ResolutionResponse = { copy(data: { dependencies?: Array, mainModuleId?: number, mocks?: mixed, }): ResolutionResponse, dependencies: Array, getResolvedDependencyPairs( module: TModule, ): $ReadOnlyArray<[string, TModule]>, options: Object, }; function resolveModuleRequires( resolutionResponse: ResolutionResponse, module: TModule, ): Array { const pairs = resolutionResponse.getResolvedDependencyPairs(module); return pairs ? pairs.map(([, dependencyModule]) => dependencyModule) : []; } function getModuleDependents( cache: Map>, module: TModule, ): Set { let dependents = cache.get(module); if (!dependents) { dependents = new Set(); cache.set(module, dependents); } return dependents; } /** * Returns an object that indicates in which module each module is required. */ function getInverseDependencies( resolutionResponse: ResolutionResponse, ): Map> { const cache = new Map(); resolutionResponse.dependencies.forEach(module => { resolveModuleRequires(resolutionResponse, module).forEach(dependency => { getModuleDependents(cache, dependency).add(module); }); }); return cache; } module.exports = getInverseDependencies;