UNPKG

htmelt

Version:

Bundle your HTML assets with Esbuild and LightningCSS. Custom plugins, HMR platform, and more.

86 lines (84 loc) 2.68 kB
// 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 };