watcher.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.enable = enable;
  6. exports.onFilesChange = onFilesChange;
  7. exports.startWatcher = startWatcher;
  8. exports.updateExternalDependencies = updateExternalDependencies;
  9. exports.watch = watch;
  10. function _path() {
  11. const data = require("path");
  12. _path = function () {
  13. return data;
  14. };
  15. return data;
  16. }
  17. const fileToDeps = new Map();
  18. const depToFiles = new Map();
  19. let isWatchMode = false;
  20. let watcher;
  21. const watchQueue = new Set();
  22. let hasStarted = false;
  23. function enable({
  24. enableGlobbing
  25. }) {
  26. isWatchMode = true;
  27. const {
  28. FSWatcher
  29. } = requireChokidar();
  30. const options = {
  31. disableGlobbing: !enableGlobbing,
  32. persistent: true,
  33. ignoreInitial: true,
  34. awaitWriteFinish: {
  35. stabilityThreshold: 50,
  36. pollInterval: 10
  37. }
  38. };
  39. watcher = new FSWatcher(options);
  40. watcher.on("unlink", unwatchFile);
  41. }
  42. function startWatcher() {
  43. hasStarted = true;
  44. for (const dep of watchQueue) {
  45. watcher.add(dep);
  46. }
  47. watchQueue.clear();
  48. watcher.on("ready", () => {
  49. console.log("The watcher is ready.");
  50. });
  51. }
  52. function watch(filename) {
  53. if (!isWatchMode) {
  54. throw new Error("Internal Babel error: .watch called when not in watch mode.");
  55. }
  56. if (!hasStarted) {
  57. watchQueue.add(_path().resolve(filename));
  58. } else {
  59. watcher.add(_path().resolve(filename));
  60. }
  61. }
  62. function onFilesChange(callback) {
  63. if (!isWatchMode) {
  64. throw new Error("Internal Babel error: .onFilesChange called when not in watch mode.");
  65. }
  66. watcher.on("all", (event, filename) => {
  67. var _depToFiles$get;
  68. if (event !== "change" && event !== "add") return;
  69. const absoluteFile = _path().resolve(filename);
  70. callback([absoluteFile, ...((_depToFiles$get = depToFiles.get(absoluteFile)) != null ? _depToFiles$get : [])], event, absoluteFile);
  71. });
  72. }
  73. function updateExternalDependencies(filename, dependencies) {
  74. if (!isWatchMode) return;
  75. const absFilename = _path().resolve(filename);
  76. const absDependencies = new Set(Array.from(dependencies, dep => _path().resolve(dep)));
  77. const deps = fileToDeps.get(absFilename);
  78. if (deps) {
  79. for (const dep of deps) {
  80. if (!absDependencies.has(dep)) {
  81. removeFileDependency(absFilename, dep);
  82. }
  83. }
  84. }
  85. for (const dep of absDependencies) {
  86. let deps = depToFiles.get(dep);
  87. if (!deps) {
  88. depToFiles.set(dep, deps = new Set());
  89. if (!hasStarted) {
  90. watchQueue.add(dep);
  91. } else {
  92. watcher.add(dep);
  93. }
  94. }
  95. deps.add(absFilename);
  96. }
  97. fileToDeps.set(absFilename, absDependencies);
  98. }
  99. function removeFileDependency(filename, dep) {
  100. const deps = depToFiles.get(dep);
  101. deps.delete(filename);
  102. if (deps.size === 0) {
  103. depToFiles.delete(dep);
  104. if (!hasStarted) {
  105. watchQueue.delete(dep);
  106. } else {
  107. watcher.unwatch(dep);
  108. }
  109. }
  110. }
  111. function unwatchFile(filename) {
  112. const deps = fileToDeps.get(filename);
  113. if (!deps) return;
  114. for (const dep of deps) {
  115. removeFileDependency(filename, dep);
  116. }
  117. fileToDeps.delete(filename);
  118. }
  119. function requireChokidar() {
  120. try {
  121. return parseInt(process.versions.node) >= 8 ? require("chokidar") : require("@nicolo-ribaudo/chokidar-2");
  122. } catch (err) {
  123. console.error("The optional dependency chokidar failed to install and is required for " + "--watch. Chokidar is likely not supported on your platform.");
  124. throw err;
  125. }
  126. }
  127. //# sourceMappingURL=watcher.js.map