From 071c61d89b3c6662c2c8e771e265ee377119e844 Mon Sep 17 00:00:00 2001 From: Hashim1999164 <64767361+Hashim1999164@users.noreply.github.com> Date: Wed, 19 Aug 2026 02:51:25 +0500 Subject: [PATCH] Ignore file watcher change events that omit a changes payload. --- .../metro/src/DeltaBundler/DeltaCalculator.js | 6 +++++- .../__tests__/DeltaCalculator-test.js | 21 +++++++++++++++++++ .../metro/src/node-haste/DependencyGraph.js | 6 +++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/packages/metro/src/DeltaBundler/DeltaCalculator.js b/packages/metro/src/DeltaBundler/DeltaCalculator.js index 3088cae280..86dd81b806 100644 --- a/packages/metro/src/DeltaBundler/DeltaCalculator.js +++ b/packages/metro/src/DeltaBundler/DeltaCalculator.js @@ -199,7 +199,11 @@ export default class DeltaCalculator extends EventEmitter { return false; } - _handleMultipleFileChanges = (changeEvent: ChangeEvent) => { + _handleMultipleFileChanges = (changeEvent: ?ChangeEvent) => { + // Some third party watchers emit a bare 'change' with no payload. + if (changeEvent == null || changeEvent.changes == null) { + return; + } const {changes, logger, rootDir} = changeEvent; // Process added files: deleted+added = modified, otherwise added diff --git a/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-test.js b/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-test.js index 917c05f956..05d45aeaa1 100644 --- a/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-test.js +++ b/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-test.js @@ -420,6 +420,27 @@ describe.each(['posix', 'win32'])('DeltaCalculator (%s)', osPlatform => { }); }); + test('should ignore change events that omit the changes payload', async () => { + await deltaCalculator.getDelta({reset: false, shallow: false}); + + expect(() => { + fileWatcher.emit('change'); + fileWatcher.emit('change', {}); + }).not.toThrow(); + + const result = await deltaCalculator.getDelta({ + reset: false, + shallow: false, + }); + + expect(result).toEqual({ + added: new Map(), + modified: new Map(), + deleted: new Set(), + reset: false, + }); + }); + test('should emit an event when there is a relevant file change', done => { deltaCalculator .getDelta({reset: false, shallow: false}) diff --git a/packages/metro/src/node-haste/DependencyGraph.js b/packages/metro/src/node-haste/DependencyGraph.js index d645af4aad..ae58113d4e 100644 --- a/packages/metro/src/node-haste/DependencyGraph.js +++ b/packages/metro/src/node-haste/DependencyGraph.js @@ -151,7 +151,11 @@ export default class DependencyGraph extends EventEmitter { await this._initializedPromise; } - _onHasteChange({changes, rootDir}: ChangeEvent) { + _onHasteChange(changeEvent: ?ChangeEvent) { + if (changeEvent == null || changeEvent.changes == null) { + return; + } + const {changes, rootDir} = changeEvent; this._resolutionCache = new Map(); [ ...changes.addedFiles,