astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
122 lines (121 loc) • 3.75 kB
JavaScript
import { ActionHandler } from "../../actions/handler.js";
import { FetchState as BaseFetchState } from "./fetch-state.js";
import { CacheHandler } from "../cache/handler.js";
import { appSymbol } from "../constants.js";
import { I18n } from "../i18n/handler.js";
import { AstroMiddleware } from "../middleware/astro-middleware.js";
import { PagesHandler } from "../pages/handler.js";
import { renderRedirect } from "../redirects/render.js";
import { AstroHandler } from "../routing/handler.js";
import { provideSession } from "../session/handler.js";
import { TrailingSlashHandler } from "../routing/trailing-slash-handler.js";
function getApp(request) {
const app = Reflect.get(request, appSymbol);
if (!app) {
throw new Error(
"FetchState(request) called on a request without an attached app. Ensure it runs inside Astro's request pipeline."
);
}
return app;
}
class FetchState extends BaseFetchState {
constructor(request) {
super(getApp(request).pipeline, request);
}
}
const astroHandlers = /* @__PURE__ */ new WeakMap();
function astro(state) {
const app = getApp(state.request);
let handler = astroHandlers.get(app);
if (!handler) {
handler = new AstroHandler(app);
astroHandlers.set(app, handler);
}
return handler.handle(state);
}
const trailingSlashHandlers = /* @__PURE__ */ new WeakMap();
function trailingSlash(state) {
const app = getApp(state.request);
let handler = trailingSlashHandlers.get(app);
if (!handler) {
handler = new TrailingSlashHandler(app);
trailingSlashHandlers.set(app, handler);
}
return handler.handle(state);
}
const middlewareInstances = /* @__PURE__ */ new WeakMap();
function middleware(state, next) {
const app = getApp(state.request);
let mw = middlewareInstances.get(app);
if (!mw) {
mw = new AstroMiddleware(app.pipeline);
middlewareInstances.set(app, mw);
}
return mw.handle(state, (s, _ctx) => next(s));
}
const pagesHandlers = /* @__PURE__ */ new WeakMap();
function pages(state) {
const app = getApp(state.request);
let handler = pagesHandlers.get(app);
if (!handler) {
handler = new PagesHandler(app.pipeline);
pagesHandlers.set(app, handler);
}
return handler.handle(state, state.getAPIContext());
}
function sessions(state) {
return provideSession(state);
}
function redirects(state) {
if (state.routeData?.type === "redirect") {
return renderRedirect(state);
}
return void 0;
}
const actionHandlers = /* @__PURE__ */ new WeakMap();
function actions(state) {
const app = getApp(state.request);
let handler = actionHandlers.get(app);
if (!handler) {
handler = new ActionHandler();
actionHandlers.set(app, handler);
}
return handler.handle(state.getAPIContext(), state);
}
const i18nHandlers = /* @__PURE__ */ new WeakMap();
function getI18n(app) {
let handler = i18nHandlers.get(app);
if (handler === void 0) {
const config = app.manifest.i18n;
handler = config && config.strategy !== "manual" ? new I18n(config, app.manifest.base, app.manifest.trailingSlash, app.manifest.buildFormat) : null;
i18nHandlers.set(app, handler);
}
return handler;
}
function i18n(state, response) {
const handler = getI18n(getApp(state.request));
if (!handler) return Promise.resolve(response);
return handler.finalize(state, response);
}
const cacheHandlers = /* @__PURE__ */ new WeakMap();
function cache(state, next) {
const app = getApp(state.request);
let handler = cacheHandlers.get(app);
if (!handler) {
handler = new CacheHandler(app);
cacheHandlers.set(app, handler);
}
return handler.handle(state, next);
}
export {
FetchState,
actions,
astro,
cache,
i18n,
middleware,
pages,
redirects,
sessions,
trailingSlash
};