From b431b089636619113e2dd39e9dc4a2c02048270a Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Tue, 8 Aug 2023 07:25:06 +1200 Subject: [PATCH] fix: don't error when watched directory gets renamed (#939) --- src/__tests__/volume.test.ts | 15 +++++++++++++++ src/volume.ts | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/__tests__/volume.test.ts b/src/__tests__/volume.test.ts index 1bf22781c..ce53839a0 100644 --- a/src/__tests__/volume.test.ts +++ b/src/__tests__/volume.test.ts @@ -1126,6 +1126,21 @@ describe('volume', () => { } }); + it('handles directories being renamed', () => { + const vol = Volume.fromJSON({ '/1': null }); + + const mockCallback = jest.fn(); + const watcher = vol.watch('/', mockCallback as any); + + try { + expect(() => vol.renameSync('/1', '/2')).not.toThrow(); + expect(mockCallback).toHaveBeenCalledWith('rename', '1'); + expect(mockCallback).toHaveBeenCalledWith('rename', '2'); + } finally { + watcher.close(); + } + }); + it('Calls listener on .watch when renaming with recursive=true', done => { const vol = new Volume(); vol.mkdirSync('/test'); diff --git a/src/volume.ts b/src/volume.ts index b8210327b..b05c028a4 100644 --- a/src/volume.ts +++ b/src/volume.ts @@ -2406,8 +2406,8 @@ export class FSWatcher extends EventEmitter { removers.forEach(r => r()); this._listenerRemovers.delete(ino); } - Object.values(curLink.children).forEach(childLink => { - if (childLink) { + Object.entries(curLink.children).forEach(([name, childLink]) => { + if (childLink && name !== '.' && name !== '..') { removeLinkNodeListeners(childLink); } });