Created
June 18, 2025 20:17
-
-
Save cacheflow/7b2950d5f4c3004e180d55c3318202ed to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
MIT License http://www.opensource.org/licenses/mit-license.php | |
Author Tobias Koppers @sokra | |
*/ | |
"use strict"; | |
const Watchpack = require("watchpack"); | |
const objectToMap = require("../util/objectToMap"); | |
class NodeWatchFileSystem { | |
constructor(inputFileSystem) { | |
this.inputFileSystem = inputFileSystem; | |
this.watcherOptions = { | |
aggregateTimeout: 0 | |
}; | |
this.watcher = new Watchpack(this.watcherOptions); | |
} | |
watch(files, dirs, missing, startTime, options, callback, callbackUndelayed) { | |
if (!Array.isArray(files)) { | |
throw new Error("Invalid arguments: 'files'"); | |
} | |
if (!Array.isArray(dirs)) { | |
throw new Error("Invalid arguments: 'dirs'"); | |
} | |
if (!Array.isArray(missing)) { | |
throw new Error("Invalid arguments: 'missing'"); | |
} | |
if (typeof callback !== "function") { | |
throw new Error("Invalid arguments: 'callback'"); | |
} | |
if (typeof startTime !== "number" && startTime) { | |
throw new Error("Invalid arguments: 'startTime'"); | |
} | |
if (typeof options !== "object") { | |
throw new Error("Invalid arguments: 'options'"); | |
} | |
if (typeof callbackUndelayed !== "function" && callbackUndelayed) { | |
throw new Error("Invalid arguments: 'callbackUndelayed'"); | |
} | |
const oldWatcher = this.watcher; | |
this.watcher = new Watchpack(options); | |
if (callbackUndelayed) { | |
this.watcher.once("change", callbackUndelayed); | |
} | |
const cachedFiles = files; | |
const cachedDirs = dirs; | |
this.watcher.once("aggregated", (changes, removals) => { | |
changes = changes.concat(removals); | |
if (this.inputFileSystem && this.inputFileSystem.purge) { | |
this.inputFileSystem.purge(changes); | |
} | |
const times = objectToMap(this.watcher.getTimes()); | |
files = new Set(files); | |
dirs = new Set(dirs); | |
missing = new Set(missing); | |
removals = new Set(removals.filter(file => files.has(file))); | |
callback( | |
null, | |
changes.filter(file => files.has(file)).sort(), | |
changes.filter(file => dirs.has(file)).sort(), | |
changes.filter(file => missing.has(file)).sort(), | |
times, | |
times, | |
removals | |
); | |
}); | |
this.watcher.watch( | |
cachedFiles.concat(missing), | |
cachedDirs.concat(missing), | |
startTime | |
); | |
if (oldWatcher) { | |
oldWatcher.close(); | |
} | |
return { | |
close: () => { | |
if (this.watcher) { | |
this.watcher.close(); | |
this.watcher = null; | |
} | |
}, | |
pause: () => { | |
if (this.watcher) { | |
this.watcher.pause(); | |
} | |
}, | |
getFileTimestamps: () => { | |
if (this.watcher) { | |
return objectToMap(this.watcher.getTimes()); | |
} else { | |
return new Map(); | |
} | |
}, | |
getContextTimestamps: () => { | |
if (this.watcher) { | |
return objectToMap(this.watcher.getTimes()); | |
} else { | |
return new Map(); | |
} | |
} | |
}; | |
} | |
} | |
module.exports = NodeWatchFileSystem; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment