htmelt
Version:
Bundle your HTML assets with Esbuild and LightningCSS. Custom plugins, HMR platform, and more.
86 lines (84 loc) • 2.68 kB
JavaScript
// src/relatedWatcher.mts
import path from "path";
function createRelatedWatcher(config) {
const dirWatcher = config.watch([], { depth: 0, ignoreInitial: true });
const fileWatcher = config.watch([], { depth: 1, ignoreInitial: true });
const relatedFiles = /* @__PURE__ */ new Map();
return {
watchFile(file, relatedFile) {
fileWatcher.add(file);
addToMappedSet(relatedFiles, file, relatedFile);
},
watchDirectory(dir, relatedFile) {
dirWatcher.add(dir);
addToMappedSet(relatedFiles, dir, relatedFile);
},
forgetRelatedFile(file) {
relatedFiles.forEach((files, watchedPath) => {
if (files.delete(file) && !files.size) {
relatedFiles.delete(watchedPath);
fileWatcher.unwatch(watchedPath);
dirWatcher.unwatch(watchedPath);
}
});
},
onChange(callback) {
const onAddOrUnlink = (file) => {
let related = relatedFiles.get(file);
related?.forEach(callback);
related = relatedFiles.get(path.dirname(file));
related?.forEach(callback);
};
fileWatcher.on("change", (file) => {
let related = relatedFiles.get(file);
related?.forEach(callback);
});
dirWatcher.on("add", onAddOrUnlink).on("unlink", onAddOrUnlink).on("addDir", onAddOrUnlink).on("unlinkDir", onAddOrUnlink);
},
async close() {
await dirWatcher.close();
await fileWatcher.close();
}
};
}
function addToMappedSet(map, key, value) {
let set = map.get(key);
if (!set) {
set = /* @__PURE__ */ new Set();
map.set(key, set);
}
set.add(value);
}
function updateRelatedWatcher(relatedWatcher, metafile, oldMetafile) {
const newRelatedFiles = /* @__PURE__ */ new Set();
metafile.watchFiles.forEach((relatedFiles, file) => {
relatedFiles.forEach((relatedFile) => {
relatedWatcher.watchFile(file, relatedFile);
newRelatedFiles.add(relatedFile);
});
});
metafile.watchDirs.forEach((relatedFiles, dir) => {
relatedFiles.forEach((relatedFile) => {
relatedWatcher.watchDirectory(dir, relatedFile);
newRelatedFiles.add(relatedFile);
});
});
if (oldMetafile) {
const oldRelatedFiles = /* @__PURE__ */ new Set();
oldMetafile.watchFiles.forEach((files) => {
files.forEach((file) => oldRelatedFiles.add(file));
});
oldMetafile.watchDirs.forEach((files) => {
files.forEach((file) => oldRelatedFiles.add(file));
});
oldRelatedFiles.forEach((file) => {
if (!newRelatedFiles.has(file)) {
relatedWatcher.forgetRelatedFile(file);
}
});
}
}
export {
createRelatedWatcher,
updateRelatedWatcher
};