118 lines
4.3 KiB
Plaintext
118 lines
4.3 KiB
Plaintext
|
import { patchOverlay } from "../core/errors/overlay.js";
|
||
|
import { createViteLoader } from "../core/module-loader/index.js";
|
||
|
import { createRouteManifest } from "../core/routing/index.js";
|
||
|
import { baseMiddleware } from "./base.js";
|
||
|
import { createController } from "./controller.js";
|
||
|
import DevPipeline from "./devPipeline.js";
|
||
|
import { handleRequest } from "./request.js";
|
||
|
import { AstroError, AstroErrorData } from "../core/errors/index.js";
|
||
|
import { getViteErrorPayload } from "../core/errors/dev/index.js";
|
||
|
import { AsyncLocalStorage } from "node:async_hooks";
|
||
|
import { IncomingMessage } from "node:http";
|
||
|
import { setRouteError } from "./server-state.js";
|
||
|
import { recordServerError } from "./error.js";
|
||
|
function createVitePluginAstroServer({
|
||
|
settings,
|
||
|
logger,
|
||
|
fs: fsMod
|
||
|
}) {
|
||
|
return {
|
||
|
name: "astro:server",
|
||
|
configureServer(viteServer) {
|
||
|
const loader = createViteLoader(viteServer);
|
||
|
const manifest = createDevelopmentManifest(settings);
|
||
|
const pipeline = new DevPipeline({ logger, manifest, settings, loader });
|
||
|
let manifestData = createRouteManifest({ settings, fsMod }, logger);
|
||
|
const controller = createController({ loader });
|
||
|
const localStorage = new AsyncLocalStorage();
|
||
|
function rebuildManifest(needsManifestRebuild) {
|
||
|
pipeline.clearRouteCache();
|
||
|
if (needsManifestRebuild) {
|
||
|
manifestData = createRouteManifest({ settings }, logger);
|
||
|
}
|
||
|
}
|
||
|
viteServer.watcher.on("add", rebuildManifest.bind(null, true));
|
||
|
viteServer.watcher.on("unlink", rebuildManifest.bind(null, true));
|
||
|
viteServer.watcher.on("change", rebuildManifest.bind(null, false));
|
||
|
function handleUnhandledRejection(rejection) {
|
||
|
const error = new AstroError({
|
||
|
...AstroErrorData.UnhandledRejection,
|
||
|
message: AstroErrorData.UnhandledRejection.message(rejection?.stack || rejection)
|
||
|
});
|
||
|
const store = localStorage.getStore();
|
||
|
if (store instanceof IncomingMessage) {
|
||
|
const request = store;
|
||
|
setRouteError(controller.state, request.url, error);
|
||
|
}
|
||
|
const { errorWithMetadata } = recordServerError(loader, settings.config, pipeline, error);
|
||
|
setTimeout(
|
||
|
async () => loader.webSocketSend(await getViteErrorPayload(errorWithMetadata)),
|
||
|
200
|
||
|
);
|
||
|
}
|
||
|
process.on("unhandledRejection", handleUnhandledRejection);
|
||
|
return () => {
|
||
|
viteServer.middlewares.stack.unshift({
|
||
|
route: "",
|
||
|
handle: baseMiddleware(settings, logger)
|
||
|
});
|
||
|
viteServer.middlewares.use(async function astroDevHandler(request, response) {
|
||
|
if (request.url === void 0 || !request.method) {
|
||
|
response.writeHead(500, "Incomplete request");
|
||
|
response.end();
|
||
|
return;
|
||
|
}
|
||
|
localStorage.run(request, () => {
|
||
|
handleRequest({
|
||
|
pipeline,
|
||
|
manifestData,
|
||
|
controller,
|
||
|
incomingRequest: request,
|
||
|
incomingResponse: response,
|
||
|
manifest
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
},
|
||
|
transform(code, id, opts = {}) {
|
||
|
if (opts.ssr)
|
||
|
return;
|
||
|
if (!id.includes("vite/dist/client/client.mjs"))
|
||
|
return;
|
||
|
return patchOverlay(code);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
function createDevelopmentManifest(settings) {
|
||
|
let i18nManifest = void 0;
|
||
|
if (settings.config.i18n) {
|
||
|
i18nManifest = {
|
||
|
fallback: settings.config.i18n.fallback,
|
||
|
routing: settings.config.i18n.routing,
|
||
|
defaultLocale: settings.config.i18n.defaultLocale,
|
||
|
locales: settings.config.i18n.locales
|
||
|
};
|
||
|
}
|
||
|
return {
|
||
|
trailingSlash: settings.config.trailingSlash,
|
||
|
buildFormat: settings.config.build.format,
|
||
|
compressHTML: settings.config.compressHTML,
|
||
|
assets: /* @__PURE__ */ new Set(),
|
||
|
entryModules: {},
|
||
|
routes: [],
|
||
|
adapterName: "",
|
||
|
clientDirectives: settings.clientDirectives,
|
||
|
renderers: [],
|
||
|
base: settings.config.base,
|
||
|
assetsPrefix: settings.config.build.assetsPrefix,
|
||
|
site: settings.config.site ? new URL(settings.config.base, settings.config.site).toString() : settings.config.site,
|
||
|
componentMetadata: /* @__PURE__ */ new Map(),
|
||
|
i18n: i18nManifest
|
||
|
};
|
||
|
}
|
||
|
export {
|
||
|
createDevelopmentManifest,
|
||
|
createVitePluginAstroServer as default
|
||
|
};
|