minista-plugin-enhance
Version:
## About
60 lines (59 loc) • 2.16 kB
JavaScript
;
import fs from "node:fs";
import path from "node:path";
import { checkDeno, getCwd, getRootDir, getTempDir } from "minista-shared-utils";
import { getGlobExportCode } from "./code.js";
import { formatPages, resolvePages } from "./page.js";
import { transformHtml } from "./html.js";
export function pluginEnhanceServe(opts) {
const id = "__minista_enhance_serve";
const isDeno = checkDeno();
const cwd = getCwd(isDeno);
let viteCommand;
let rootDir = "";
let tempDir = "";
let globDir = "";
let globFile = "";
return {
name: "vite-plugin:minista-enhance-serve",
config: async (config, { command }) => {
viteCommand = command;
if (viteCommand === "serve") {
rootDir = getRootDir(cwd, config.root || "");
tempDir = getTempDir(cwd, rootDir);
globDir = path.join(tempDir, "glob");
globFile = path.join(globDir, `${id}.js`);
const code = getGlobExportCode(opts);
await fs.promises.mkdir(globDir, { recursive: true });
await fs.promises.writeFile(globFile, code, "utf8");
}
},
configureServer(server) {
return () => {
server.middlewares.use(async (req, res, next) => {
try {
const base = server.config.base;
const hasBaseDir = base && base !== "/";
const originalUrl = req.originalUrl || "";
const url = hasBaseDir ? originalUrl.replace(new RegExp(`^${base}`), "/") : originalUrl;
const ssr = server.ssrLoadModule;
const { PAGES } = await ssr(globFile);
const formatedPages = formatPages(PAGES, opts);
const resolvedPages = resolvePages(formatedPages);
const resolvedPage = resolvedPages.find((page) => page.path === url);
let html = "";
if (resolvedPage) {
html = transformHtml({ resolvedPage });
html = await server.transformIndexHtml(originalUrl, html);
}
res.statusCode = 200;
res.end(html);
} catch (e) {
server.ssrFixStacktrace(e);
next(e);
}
});
};
}
};
}