astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
47 lines (46 loc) • 1.76 kB
JavaScript
import fetchable from "virtual:astro:fetchable";
import { manifest } from "virtual:astro:manifest";
import { clearActions } from "../../../../actions/load.js";
import { createNonRunnableEnvironment } from "../../../environment/dev-nonrunnable.js";
import { setEnvironment } from "../../../environment/index.js";
import { createConsoleLogger } from "../../../logger/impls/console.js";
import { getLogger, setLogger } from "../../../logger/manifest-logger.js";
import { clearMiddleware } from "../../../middleware/load.js";
import { getRouteCache } from "../../../render/route-cache.js";
import { updateRouteTable } from "../../../routing/route-table.js";
import { DevFacadeApp } from "../../dev-facade.js";
let hmrWired = false;
const createApp = ({ streaming } = {}) => {
setLogger(manifest, createConsoleLogger(manifest.logLevel));
setEnvironment(manifest, createNonRunnableEnvironment());
const app = new DevFacadeApp(manifest, streaming);
app.setFetchHandler(fetchable);
if (import.meta.hot && !hmrWired) {
hmrWired = true;
import.meta.hot.on("astro:routes-updated", async () => {
try {
const { routes: newRoutes } = await import("virtual:astro:routes");
updateRouteTable(
manifest,
newRoutes.map((r) => r.routeData)
);
} catch (e) {
getLogger(manifest).error("router", `Failed to update routes via HMR:
${e}`);
}
});
import.meta.hot.on("astro:content-changed", () => {
getRouteCache(manifest).clearAll();
});
import.meta.hot.on("astro:middleware-updated", () => {
clearMiddleware(manifest);
});
import.meta.hot.on("astro:actions-updated", () => {
clearActions(manifest);
});
}
return app;
};
export {
createApp
};