in packages/metro/src/DeltaBundler/DeltaCalculator.js [196:257]
async _getChangedDependencies(
modifiedFiles: Set<string>,
deletedFiles: Set<string>,
): Promise<DeltaResult<T>> {
if (!this._graph.dependencies.size) {
const {added} = await initialTraverseDependencies(
this._graph,
this._options,
);
return {
added,
modified: new Map(),
deleted: new Set(),
reset: true,
};
}
// If a file has been deleted, we want to invalidate any other file that
// depends on it, so we can process it and correctly return an error.
deletedFiles.forEach((filePath: string) => {
const module = this._graph.dependencies.get(filePath);
if (module) {
module.inverseDependencies.forEach((path: string) => {
// Only mark the inverse dependency as modified if it's not already
// marked as deleted (in that case we can just ignore it).
if (!deletedFiles.has(path)) {
modifiedFiles.add(path);
}
});
}
});
// We only want to process files that are in the bundle.
const modifiedDependencies = Array.from(modifiedFiles).filter(
(filePath: string) => this._graph.dependencies.has(filePath),
);
// No changes happened. Return empty delta.
if (modifiedDependencies.length === 0) {
return {
added: new Map(),
modified: new Map(),
deleted: new Set(),
reset: false,
};
}
const {added, modified, deleted} = await traverseDependencies(
modifiedDependencies,
this._graph,
this._options,
);
return {
added,
modified,
deleted,
reset: false,
};
}