iles
Version:
Vite & Vue powered static site generator with partial hydration
101 lines (98 loc) • 3.01 kB
JavaScript
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
};