diff --git a/packages/metro-file-map/src/lib/TreeFS.js b/packages/metro-file-map/src/lib/TreeFS.js index 3dc71cb7ff..5f78836665 100644 --- a/packages/metro-file-map/src/lib/TreeFS.js +++ b/packages/metro-file-map/src/lib/TreeFS.js @@ -30,7 +30,7 @@ type FileNode = FileMetadata; type MixedNode = FileNode | DirectoryNode; function isDirectory(node: ?MixedNode): node is DirectoryNode { - return node instanceof Map; + return node != null && !Array.isArray(node); } function isRegularFile(node: FileNode): boolean { diff --git a/packages/metro-file-map/src/lib/__tests__/TreeFS-test.js b/packages/metro-file-map/src/lib/__tests__/TreeFS-test.js index a94efce125..152ca14933 100644 --- a/packages/metro-file-map/src/lib/__tests__/TreeFS-test.js +++ b/packages/metro-file-map/src/lib/__tests__/TreeFS-test.js @@ -90,6 +90,20 @@ describe.each([['win32'], ['posix']])('TreeFS on %s', platform => { expect(tfs.exists(p('/project/link-to-nowhere'))).toBe(false); }); + test('traverses a snapshot deserialized in another realm', () => { + // Under Jest, `node:v8` is a host module, so `deserialize` returns `Map`s + // whose prototype is not the sandbox's `Map.prototype`. + const {deserialize, serialize} = require('node:v8'); + const deserialized = TreeFS.fromDeserializedSnapshot({ + rootDir: p('/project'), + fileSystemData: deserialize(serialize(tfs.getSerializableSnapshot())), + processFile: () => { + throw new Error('Not implemented'); + }, + }); + expect(deserialized.exists(p('/project/foo/another.js'))).toBe(true); + }); + test('implements linkStats()', () => { expect(tfs.linkStats(p('/project/link-to-foo/another.js'))).toEqual({ fileType: 'f',