"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.enable = enable; exports.onFilesChange = onFilesChange; exports.startWatcher = startWatcher; exports.updateExternalDependencies = updateExternalDependencies; exports.watch = watch; function _path() { const data = require("path"); _path = function () { return data; }; return data; } const fileToDeps = new Map(); const depToFiles = new Map(); let isWatchMode = false; let watcher; const watchQueue = new Set(); let hasStarted = false; function enable({ enableGlobbing }) { isWatchMode = true; const { FSWatcher } = requireChokidar(); const options = { disableGlobbing: !enableGlobbing, persistent: true, ignoreInitial: true, awaitWriteFinish: { stabilityThreshold: 50, pollInterval: 10 } }; watcher = new FSWatcher(options); watcher.on("unlink", unwatchFile); } function startWatcher() { hasStarted = true; for (const dep of watchQueue) { watcher.add(dep); } watchQueue.clear(); watcher.on("ready", () => { console.log("The watcher is ready."); }); } function watch(filename) { if (!isWatchMode) { throw new Error("Internal Babel error: .watch called when not in watch mode."); } if (!hasStarted) { watchQueue.add(_path().resolve(filename)); } else { watcher.add(_path().resolve(filename)); } } function onFilesChange(callback) { if (!isWatchMode) { throw new Error("Internal Babel error: .onFilesChange called when not in watch mode."); } watcher.on("all", (event, filename) => { var _depToFiles$get; if (event !== "change" && event !== "add") return; const absoluteFile = _path().resolve(filename); callback([absoluteFile, ...((_depToFiles$get = depToFiles.get(absoluteFile)) != null ? _depToFiles$get : [])], event, absoluteFile); }); } function updateExternalDependencies(filename, dependencies) { if (!isWatchMode) return; const absFilename = _path().resolve(filename); const absDependencies = new Set(Array.from(dependencies, dep => _path().resolve(dep))); const deps = fileToDeps.get(absFilename); if (deps) { for (const dep of deps) { if (!absDependencies.has(dep)) { removeFileDependency(absFilename, dep); } } } for (const dep of absDependencies) { let deps = depToFiles.get(dep); if (!deps) { depToFiles.set(dep, deps = new Set()); if (!hasStarted) { watchQueue.add(dep); } else { watcher.add(dep); } } deps.add(absFilename); } fileToDeps.set(absFilename, absDependencies); } function removeFileDependency(filename, dep) { const deps = depToFiles.get(dep); deps.delete(filename); if (deps.size === 0) { depToFiles.delete(dep); if (!hasStarted) { watchQueue.delete(dep); } else { watcher.unwatch(dep); } } } function unwatchFile(filename) { const deps = fileToDeps.get(filename); if (!deps) return; for (const dep of deps) { removeFileDependency(filename, dep); } fileToDeps.delete(filename); } function requireChokidar() { try { return parseInt(process.versions.node) >= 8 ? require("chokidar") : require("@nicolo-ribaudo/chokidar-2"); } catch (err) { console.error("The optional dependency chokidar failed to install and is required for " + "--watch. Chokidar is likely not supported on your platform."); throw err; } } //# sourceMappingURL=watcher.js.map