astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
42 lines (41 loc) • 1.53 kB
JavaScript
import { AstroError } from "../core/errors/errors.js";
import { ActionsWithoutServerOutputError } from "../core/errors/errors-data.js";
import { hasNonPrerenderedRoute } from "../core/routing/helpers.js";
import { viteID } from "../core/util.js";
import { ACTION_RPC_ROUTE_PATTERN, ACTIONS_TYPES_FILE, VIRTUAL_MODULE_ID } from "./consts.js";
/**
* This integration is applied when the user is using Actions in their project.
* It will inject the necessary routes and middlewares to handle actions.
*/
// TODO: do not use an integration for this
export default function astroIntegrationActionsRouteHandler({ settings, filename }) {
return {
name: VIRTUAL_MODULE_ID,
hooks: {
async "astro:config:setup"() {
settings.injectedRoutes.push({
pattern: ACTION_RPC_ROUTE_PATTERN,
entrypoint: "astro/actions/runtime/entrypoints/route.js",
prerender: false,
origin: "internal"
});
},
"astro:config:done": async (params) => {
const stringifiedActionsImport = JSON.stringify(viteID(new URL(`./${filename}`, params.config.srcDir)));
settings.injectedTypes.push({
filename: ACTIONS_TYPES_FILE,
content: `declare module "astro:actions" {
export const actions: typeof import(${stringifiedActionsImport})["server"];
}`
});
},
"astro:routes:resolved": ({ routes }) => {
if (!settings.config.adapter && !hasNonPrerenderedRoute(routes)) {
const error = new AstroError(ActionsWithoutServerOutputError);
error.stack = undefined;
throw error;
}
}
}
};
}