UNPKG

iles

Version:

Vite & Vue powered static site generator with partial hydration

84 lines (81 loc) 2.5 kB
import { flattenPath } from "./chunk-PUZAE3UL.js"; import { IslandsPlugins } from "./chunk-MXNYLPHV.js"; import { extendManualChunks } from "./chunk-SZYMUTOS.js"; import { TURBO_SCRIPT_PATH } from "./chunk-TAVOVDVB.js"; // src/node/build/islands.ts import { promises as fs } from "fs"; import { relative, resolve } from "pathe"; import { build as viteBuild, mergeConfig as mergeViteConfig } from "vite"; var VIRTUAL_PREFIX = "virtual_ile_"; var VIRTUAL_TURBO_ID = "iles/turbo"; async function bundleIslands(config, islandsByPath) { const entrypoints = /* @__PURE__ */ Object.create(null); const islandComponents = /* @__PURE__ */ Object.create(null); for (const path in islandsByPath) { islandsByPath[path].forEach((island) => { island.entryFilename = `${flattenPath(path)}_${island.id}`; entrypoints[island.entryFilename] = island.script; islandComponents[island.componentPath] = island.componentPath; }); } const entryFiles = [...Object.keys(entrypoints), ...Object.keys(islandComponents)].sort(); if (config.turbo) entryFiles.push(resolve(VIRTUAL_TURBO_ID)); if (Object.keys(entryFiles).length === 0) return; await viteBuild(mergeViteConfig(config.vite, { logLevel: config.vite.logLevel ?? "warn", publicDir: false, build: { emptyOutDir: false, outDir: config.outDir, manifest: true, minify: "esbuild", rollupOptions: { input: entryFiles, output: { entryFileNames: chunkFileNames, chunkFileNames, manualChunks: extendManualChunks(config) } } }, plugins: [ virtualEntrypointsPlugin(config.root, entrypoints), IslandsPlugins(config) ] })); } function virtualEntrypointsPlugin(root, entrypoints) { return { name: "iles:entrypoints", resolveId(id, importer) { if (id in entrypoints) return VIRTUAL_PREFIX + id; if (relative(root, id.split("?", 2)[0]) === VIRTUAL_TURBO_ID) return VIRTUAL_TURBO_ID; }, async load(id) { if (id.startsWith(VIRTUAL_PREFIX)) return entrypoints[id.slice(VIRTUAL_PREFIX.length)]; if (id === VIRTUAL_TURBO_ID) return await fs.readFile(TURBO_SCRIPT_PATH, "utf-8"); } }; } function chunkFileNames(chunk) { if (chunk.name.includes(".vue_vue")) return `assets/${chunk.name.split(".vue_vue")[0]}.[hash].js`; return "assets/[name].[hash].js"; } export { VIRTUAL_PREFIX, VIRTUAL_TURBO_ID, bundleIslands };