UNPKG

iles

Version:

Vite & Vue powered static site generator with partial hydration

101 lines (98 loc) 3.01 kB
import { rm } from "./chunk-PUZAE3UL.js"; import { IslandsPlugins } from "./chunk-MXNYLPHV.js"; import { APP_PATH } from "./chunk-TAVOVDVB.js"; // src/node/build/bundle.ts import { promises as fs } from "fs"; import glob from "fast-glob"; import { relative, dirname, resolve, join } from "pathe"; import { build, mergeConfig as mergeViteConfig } from "vite"; async function bundle(config) { const entrypoints = resolveEntrypoints(config); const [clientResult, serverResult] = await Promise.all([ bundleWithVite(config, entrypoints, { ssr: false }), bundleWithVite(config, entrypoints, { ssr: true }), bundleHtmlEntrypoints(config) ]); return { clientResult, serverResult }; } async function bundleHtmlEntrypoints(config) { const entrypoints = glob.sync( resolve(config.pagesDir, "./**/*.html"), { cwd: config.root, ignore: ["node_modules/**"] } ); if (entrypoints.length > 0) await bundleWithVite(config, entrypoints, { htmlBuild: true, ssr: false }); } async function bundleWithVite(config, entrypoints, options) { const { htmlBuild = false, ssr } = options; return await build(mergeViteConfig(config.vite, { logLevel: config.vite.logLevel ?? "warn", ssr: { external: ["vue", "vue/server-renderer"], noExternal: ["iles"] }, plugins: [ IslandsPlugins(config), htmlBuild ? moveHtmlPagesPlugin(config) : !ssr && removeJsPlugin(), ssr && addESMPackagePlugin(config) ], build: { ssr, cssCodeSplit: htmlBuild || !ssr, minify: ssr ? false : "esbuild", emptyOutDir: ssr, outDir: ssr ? config.tempDir : config.outDir, sourcemap: false, rollupOptions: { input: entrypoints, preserveEntrySignatures: htmlBuild ? void 0 : "allow-extension", treeshake: htmlBuild } } })); } function resolveEntrypoints(config) { return { app: APP_PATH }; } function removeJsPlugin() { return { name: "iles:client-js-removal", generateBundle(_, bundle2) { for (const name in bundle2) if (bundle2[name].fileName.endsWith(".js")) delete bundle2[name]; } }; } function moveHtmlPagesPlugin(config) { return { name: "iles:html-pages", async writeBundle(options, bundle2) { const outDir = resolve(config.root, config.outDir); await Promise.all(Object.entries(bundle2).map(async ([name, chunk]) => { if (name.endsWith(".html")) { const dest = resolve(outDir, relative(config.pagesDir, resolve(config.root, name))); await fs.mkdir(dirname(dest), { recursive: true }); await fs.rename(resolve(outDir, name), dest); } })); rm(resolve(outDir, relative(config.root, config.srcDir))); } }; } function addESMPackagePlugin(config) { return { name: "iles:add-common-js-package-plugin", async writeBundle() { await fs.writeFile(join(config.tempDir, "package.json"), JSON.stringify({ type: "module" })); } }; } export { bundle };