-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathhot-reload.js
52 lines (34 loc) · 1.24 KB
/
hot-reload.js
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
const filesInDirectory = (dir) => new Promise (resolve =>
dir.createReader ().readEntries ((entries) =>
Promise.all (entries.filter ((e) => e.name[0] !== ".").map (e =>
e.isDirectory
? filesInDirectory (e)
: new Promise ((resolve) => e.file (resolve))
))
.then ((files) => [].concat (...files))
.then (resolve)
)
);
const timestampForFilesInDirectory = (dir) =>
filesInDirectory (dir).then (files =>
files.map (f => f.name + f.lastModifiedDate).join ());
const reload = () => {
chrome.tabs.query ({ active: true, currentWindow: true }, tabs => {
if (tabs[0]) { chrome.tabs.reload (tabs[0].id) }
chrome.runtime.reload ();
});
};
const watchChanges = (dir, lastTimestamp) => {
timestampForFilesInDirectory (dir).then (timestamp => {
if (!lastTimestamp || (lastTimestamp === timestamp)) {
setTimeout (() => watchChanges (dir, timestamp), 1000); // retry after 1s
} else {
reload ();
}
});
};
chrome.management.getSelf ((self) => {
if (self.installType === "development") {
chrome.runtime.getPackageDirectoryEntry ((dir) => watchChanges (dir));
}
});