generated from el3um4s/typescript-npm-package-starter
-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
chokidar.ts
128 lines (116 loc) · 2.79 KB
/
chokidar.ts
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* eslint-disable @typescript-eslint/no-unused-vars */
import { IPC, SendChannels } from "@el3um4s/ipc-for-electron";
import { BrowserWindow } from "electron";
import Chokidar = require("chokidar");
import { toTry } from "@el3um4s/to-try";
import {
NameAPI,
WatchFolderMessage,
WatchFileMessage,
Changed,
} from "./interfaces";
const nameAPI: NameAPI = "chokidar";
// to Main
const validSendChannel: SendChannels = {
watchFolder: watchFolder,
watchFile: watchFile,
};
// from Main
const validReceiveChannel: string[] = ["folderChanged", "fileChanged"];
const chokidar = new IPC({
nameAPI,
validSendChannel,
validReceiveChannel,
});
export default chokidar;
const sendMessage = (
watcher: Chokidar.FSWatcher,
mainWindow: BrowserWindow,
nameMessage: string,
message: Changed
) => {
const [ok, ko] = toTry(() =>
mainWindow.webContents.send(nameMessage, message)
);
if (ko) {
watcher.close();
}
};
async function watchFolder(
mainWindow: BrowserWindow,
event: Electron.IpcMainEvent,
message: WatchFolderMessage
) {
const { folderPath, nameWatcher } = message;
const watcher = Chokidar.watch(folderPath, {
// eslint-disable-next-line no-useless-escape
ignored: /(^|[\/\\])\../, // ignore dotfiles
ignoreInitial: true,
});
watcher
.on("add", (path) =>
sendMessage(watcher, mainWindow, "folderChanged", {
path,
eventName: "add",
nameWatcher,
})
)
.on("change", (path) =>
sendMessage(watcher, mainWindow, "folderChanged", {
path,
eventName: "change",
nameWatcher,
})
)
.on("unlink", (path) =>
sendMessage(watcher, mainWindow, "folderChanged", {
path,
eventName: "unlink",
nameWatcher,
})
)
.on("addDir", (path) =>
sendMessage(watcher, mainWindow, "folderChanged", {
path,
eventName: "addDir",
nameWatcher,
})
)
.on("unlinkDir", (path) =>
sendMessage(watcher, mainWindow, "folderChanged", {
path,
eventName: "unlinkDir",
nameWatcher,
})
);
}
function watchFile(
mainWindow: BrowserWindow,
event: Electron.IpcMainEvent,
message: WatchFileMessage
) {
const { filePath, nameWatcher } = message;
const watcher = Chokidar.watch(filePath, { ignoreInitial: true });
watcher
.on("add", (path) =>
sendMessage(watcher, mainWindow, "fileChanged", {
path,
eventName: "add",
nameWatcher,
})
)
.on("change", (path) =>
sendMessage(watcher, mainWindow, "fileChanged", {
path,
eventName: "change",
nameWatcher,
})
)
.on("unlink", (path) =>
sendMessage(watcher, mainWindow, "fileChanged", {
path,
eventName: "unlink",
nameWatcher,
})
);
}