55 lines
1.5 KiB
Plaintext
55 lines
1.5 KiB
Plaintext
import { pathToFileURL } from "node:url";
|
|
import { createServer } from "vite";
|
|
import loadFallbackPlugin from "../../vite-plugin-load-fallback/index.js";
|
|
import { debug } from "../logger/core.js";
|
|
async function createViteServer(root, fs) {
|
|
const viteServer = await createServer({
|
|
server: { middlewareMode: true, hmr: false, watch: null },
|
|
optimizeDeps: { noDiscovery: true },
|
|
clearScreen: false,
|
|
appType: "custom",
|
|
ssr: {
|
|
// NOTE: Vite doesn't externalize linked packages by default. During testing locally,
|
|
// these dependencies trip up Vite's dev SSR transform. Awaiting upstream feature:
|
|
// https://github.com/vitejs/vite/pull/10939
|
|
external: [
|
|
"@astrojs/tailwind",
|
|
"@astrojs/mdx",
|
|
"@astrojs/react",
|
|
"@astrojs/preact",
|
|
"@astrojs/sitemap",
|
|
"@astrojs/markdoc"
|
|
]
|
|
},
|
|
plugins: [loadFallbackPlugin({ fs, root: pathToFileURL(root) })]
|
|
});
|
|
return viteServer;
|
|
}
|
|
async function loadConfigWithVite({
|
|
configPath,
|
|
fs,
|
|
root
|
|
}) {
|
|
if (/\.[cm]?js$/.test(configPath)) {
|
|
try {
|
|
const config = await import(pathToFileURL(configPath).toString() + "?t=" + Date.now());
|
|
return config.default ?? {};
|
|
} catch (e) {
|
|
debug("Failed to load config with Node", e);
|
|
}
|
|
}
|
|
let server;
|
|
try {
|
|
server = await createViteServer(root, fs);
|
|
const mod = await server.ssrLoadModule(configPath, { fixStacktrace: true });
|
|
return mod.default ?? {};
|
|
} finally {
|
|
if (server) {
|
|
await server.close();
|
|
}
|
|
}
|
|
}
|
|
export {
|
|
loadConfigWithVite
|
|
};
|