"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * It's an implementation of FileSystem interface which reads from the real file system, but write to the in-memory file system. * * @param memFileSystem * @param realFileSystem */ function createPassiveFileSystem(memFileSystem, realFileSystem) { function exists(path) { return realFileSystem.exists(path) || memFileSystem.exists(path); } function readFile(path, encoding) { const fsStats = realFileSystem.readStats(path); const memStats = memFileSystem.readStats(path); if (fsStats && memStats) { return fsStats.mtimeMs > memStats.mtimeMs ? realFileSystem.readFile(path, encoding) : memFileSystem.readFile(path, encoding); } else if (fsStats) { return realFileSystem.readFile(path, encoding); } else if (memStats) { return memFileSystem.readFile(path, encoding); } } function readDir(path) { const fsDirents = realFileSystem.readDir(path); const memDirents = memFileSystem.readDir(path); // merge list of dirents from fs and mem return fsDirents .filter((fsDirent) => !memDirents.some((memDirent) => memDirent.name === fsDirent.name)) .concat(memDirents); } function readStats(path) { const fsStats = realFileSystem.readStats(path); const memStats = memFileSystem.readStats(path); if (fsStats && memStats) { return fsStats.mtimeMs > memStats.mtimeMs ? fsStats : memStats; } else if (fsStats) { return fsStats; } else if (memStats) { return memStats; } } return Object.assign(Object.assign({}, memFileSystem), { exists(path) { return exists(realFileSystem.realPath(path)); }, readFile(path, encoding) { return readFile(realFileSystem.realPath(path), encoding); }, readDir(path) { return readDir(realFileSystem.realPath(path)); }, readStats(path) { return readStats(realFileSystem.realPath(path)); }, realPath(path) { return realFileSystem.realPath(path); }, clearCache() { realFileSystem.clearCache(); } }); } exports.createPassiveFileSystem = createPassiveFileSystem;