Skip to content

Commit 28abfc9

Browse files
motiz88facebook-github-bot
authored andcommitted
Commit dependency order changes to graph (#1173)
Summary: Pull Request resolved: #1173 Changelog: * **[Fix]**: Edge case leading to invalid bundles when only the *order* of dependencies within a module has changed. This is a fix for a bug introduced in D52457312 - confirmed by backporting the new unit test and observing that it passes on D52457312's base commit. Reviewed By: hoxyq Differential Revision: D52660716 fbshipit-source-id: 1d4aac4c30d7726af528e31f4dc50a8f62688e14
1 parent 9212156 commit 28abfc9

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

packages/metro/src/DeltaBundler/Graph.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ export class Graph<T = MixedOutput> {
421421
}
422422
}
423423

424-
// Diff dependencies (1/2): remove dependencies that have changed or been removed.
424+
// Diff dependencies (1/3): remove dependencies that have changed or been removed.
425425
let dependenciesRemoved = false;
426426
for (const [key, prevDependency] of previousDependencies) {
427427
const curDependency = currentDependencies.get(key);
@@ -434,7 +434,7 @@ export class Graph<T = MixedOutput> {
434434
}
435435
}
436436

437-
// Diff dependencies (2/2): add dependencies that have changed or been added.
437+
// Diff dependencies (2/3): add dependencies that have changed or been added.
438438
let dependenciesAdded = false;
439439
if (!commitOptions.onlyRemove) {
440440
for (const [key, curDependency] of currentDependencies) {
@@ -456,11 +456,21 @@ export class Graph<T = MixedOutput> {
456456
}
457457
}
458458

459+
// Diff dependencies (3/3): detect changes in the ordering of dependency
460+
// keys, which must be committed even if no other changes were made.
461+
const previousDependencyKeys = [...previousDependencies.keys()];
462+
const dependencyKeysChangedOrReordered =
463+
currentDependencies.size !== previousDependencies.size ||
464+
[...currentDependencies.keys()].some(
465+
(currentKey, index) => currentKey !== previousDependencyKeys[index],
466+
);
467+
459468
if (
460469
previousModule != null &&
461470
!transformOutputMayDiffer(previousModule, nextModule) &&
462471
!dependenciesRemoved &&
463-
!dependenciesAdded
472+
!dependenciesAdded &&
473+
!dependencyKeysChangedOrReordered
464474
) {
465475
// We have not operated on nextModule, so restore previousModule
466476
// to aid diffing. Don't add this path to delta.touched.

packages/metro/src/DeltaBundler/__tests__/Graph-test.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3913,3 +3913,32 @@ describe('recovery from transform and resolution errors', () => {
39133913
});
39143914
});
39153915
});
3916+
3917+
test('when only the order of transformer dependencies changes, the resolved dependencies should be reordered too', async () => {
3918+
await graph.initialTraverseDependencies(options);
3919+
expect([
3920+
...nullthrows(graph.dependencies.get('/foo')).dependencies.values(),
3921+
]).toEqual([
3922+
objectContaining({absolutePath: '/bar'}),
3923+
objectContaining({absolutePath: '/baz'}),
3924+
]);
3925+
3926+
Actions.modifyFile('/foo');
3927+
const transformerDeps = nullthrows(mockedDependencyTree.get('/foo'));
3928+
mockedDependencyTree.set('/foo', [...transformerDeps].reverse());
3929+
3930+
expect(
3931+
getPaths(await graph.traverseDependencies([...files], options)),
3932+
).toEqual({
3933+
added: new Set(),
3934+
modified: new Set(['/foo']),
3935+
deleted: new Set(),
3936+
});
3937+
3938+
expect([
3939+
...nullthrows(graph.dependencies.get('/foo')).dependencies.values(),
3940+
]).toEqual([
3941+
objectContaining({absolutePath: '/baz'}),
3942+
objectContaining({absolutePath: '/bar'}),
3943+
]);
3944+
});

0 commit comments

Comments
 (0)