All files / src/lib/pluginManager watchGlobalPlugins.ts

100% Statements 20/20
100% Branches 6/6
100% Functions 4/4
100% Lines 20/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 722x 2x 2x         2x               2x   2x         2x 6x 15x 13x   2x       2x                   2x                   2x                   2x 1x 1x 1x     2x     2x  
import { watch } from "chokidar";
import Path from "path";
import { ensureGlobalPluginsPath } from "./globalPlugins";
import type { Stats } from "fs";
 
type WatchCallback = (path: string) => void;
 
const watchGlobalPlugins = async (callbacks: {
  onChangedThemePlugin: WatchCallback;
  onChangedLanguagePlugin: WatchCallback;
  onChangedTemplatePlugin: WatchCallback;
  onRemoveThemePlugin: WatchCallback;
  onRemoveLanguagePlugin: WatchCallback;
  onRemoveTemplatePlugin: WatchCallback;
}) => {
  const globalPluginsPath = await ensureGlobalPluginsPath();
 
  const awaitWriteFinish = {
    stabilityThreshold: 1000,
    pollInterval: 100,
  };
 
  const ignoreUnlessFilename = (filename: string) => {
    return (path: string, stats: Stats | undefined) => {
      if (stats?.isFile()) {
        return Path.basename(path).toLowerCase() !== filename;
      }
      return false;
    };
  };
 
  const themePluginWatcher = watch(globalPluginsPath, {
    ignoreInitial: true,
    persistent: true,
    awaitWriteFinish,
    ignored: ignoreUnlessFilename("theme.json"),
  })
    .on("add", callbacks.onChangedThemePlugin)
    .on("change", callbacks.onChangedThemePlugin)
    .on("unlink", callbacks.onRemoveThemePlugin);
 
  const languagePluginWatcher = watch(globalPluginsPath, {
    ignoreInitial: true,
    persistent: true,
    awaitWriteFinish,
    ignored: ignoreUnlessFilename("lang.json"),
  })
    .on("add", callbacks.onChangedLanguagePlugin)
    .on("change", callbacks.onChangedLanguagePlugin)
    .on("unlink", callbacks.onRemoveLanguagePlugin);
 
  const templatePluginWatcher = watch(globalPluginsPath, {
    ignoreInitial: true,
    persistent: true,
    awaitWriteFinish,
    ignored: ignoreUnlessFilename("project.gbsproj"),
  })
    .on("add", callbacks.onChangedTemplatePlugin)
    .on("change", callbacks.onChangedTemplatePlugin)
    .on("unlink", callbacks.onRemoveTemplatePlugin);
 
  const stopWatching = () => {
    themePluginWatcher.close();
    languagePluginWatcher.close();
    templatePluginWatcher.close();
  };
 
  return stopWatching;
};
 
export default watchGlobalPlugins;