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