UNPKG

rwsdk

Version:

Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime

74 lines (73 loc) 3.02 kB
import debug from "debug"; import { normalizeModulePath } from "../lib/normalizeModulePath.mjs"; const log = debug("rwsdk:vite:directives-filtering-plugin"); function filterDirectiveModules({ clientFiles, serverFiles, projectRootDir, includedModules, }) { process.env.VERBOSE && log("Directive modules before filtering: client=%O, server=%O", Array.from(clientFiles), Array.from(serverFiles)); for (const files of [clientFiles, serverFiles]) { for (const id of files) { const absoluteId = normalizeModulePath(id, projectRootDir, { absolute: true, }); if (!includedModules.has(absoluteId)) { files.delete(id); } } } process.env.VERBOSE && log("Client/server files after filtering: client=%O, server=%O", Array.from(clientFiles), Array.from(serverFiles)); } export const directivesFilteringPlugin = ({ clientFiles, serverFiles, projectRootDir, }) => { return { name: "rwsdk:directives-filtering", enforce: "post", buildEnd() { if (this.environment.name !== "worker" || process.env.RWSDK_BUILD_PASS !== "worker") { return; } log("Filtering directive modules after worker build..."); const includedModules = new Set(); for (const id of this.getModuleIds()) { const info = this.getModuleInfo(id); if (info && info.isIncluded !== false) { includedModules.add(id); } } filterDirectiveModules({ clientFiles, serverFiles, projectRootDir, includedModules, }); }, generateBundle(_options, bundle) { if (this.environment.name !== "worker" || process.env.RWSDK_BUILD_PASS !== "worker") { return; } log("Filtering directive modules from bundle output..."); // context(justinvdm, 2026-05-13): Rolldown (Vite 8+) does not expose // ModuleInfo.isIncluded. Instead, we inspect the final output chunks. // A module whose renderedLength is 0 (or missing) was tree-shaken to // empty and should be removed from the directive sets. const includedModules = new Set(); for (const output of Object.values(bundle)) { if (output.type !== "chunk") { continue; } for (const [moduleId, renderedModule] of Object.entries(output.modules)) { if (renderedModule.renderedLength > 0) { includedModules.add(moduleId); } } } filterDirectiveModules({ clientFiles, serverFiles, projectRootDir, includedModules, }); }, }; };