Files

80 lines
2.6 KiB
JavaScript

import { DEFAULT_COMPONENTS } from "../core/routing/default.js";
import { routeIsRedirect } from "../core/routing/helpers.js";
import { VIRTUAL_PAGE_MODULE_ID } from "./const.js";
import { getVirtualModulePageName } from "./util.js";
import { ASTRO_VITE_ENVIRONMENT_NAMES } from "../core/constants.js";
const VIRTUAL_PAGES_MODULE_ID = "virtual:astro:pages";
const VIRTUAL_PAGES_RESOLVED_MODULE_ID = "\0" + VIRTUAL_PAGES_MODULE_ID;
function getRoutesForEnvironment(routes, isPrerender) {
const result = /* @__PURE__ */ new Set();
for (const route of routes) {
if (route.prerender === isPrerender) {
result.add(route);
}
if (route.redirectRoute) {
result.add(route.redirectRoute);
}
}
return result;
}
function pluginPages({ routesList }) {
return {
name: "@astro/plugin-pages",
enforce: "post",
applyToEnvironment(environment) {
return environment.name === ASTRO_VITE_ENVIRONMENT_NAMES.ssr || environment.name === ASTRO_VITE_ENVIRONMENT_NAMES.prerender;
},
resolveId: {
filter: {
id: new RegExp(`^${VIRTUAL_PAGES_MODULE_ID}$`)
},
handler() {
return VIRTUAL_PAGES_RESOLVED_MODULE_ID;
}
},
load: {
filter: {
id: new RegExp(`^${VIRTUAL_PAGES_RESOLVED_MODULE_ID}$`)
},
async handler() {
const imports = [];
const pageMap = [];
let i = 0;
const envName = this.environment.name;
const isSSR = envName === ASTRO_VITE_ENVIRONMENT_NAMES.ssr;
const isPrerender = envName === ASTRO_VITE_ENVIRONMENT_NAMES.prerender;
const routes = isSSR || isPrerender ? getRoutesForEnvironment(routesList.routes, isPrerender) : new Set(routesList.routes);
for (const route of routes) {
if (routeIsRedirect(route)) {
continue;
}
if (DEFAULT_COMPONENTS.some((component) => route.component === component)) {
continue;
}
const virtualModuleName = getVirtualModulePageName(
VIRTUAL_PAGE_MODULE_ID,
route.component
);
const module = await this.resolve(virtualModuleName);
if (module) {
const variable = `_page${i}`;
imports.push(`const ${variable} = () => import("${virtualModuleName}");`);
pageMap.push(`[${JSON.stringify(route.component)}, ${variable}]`);
i++;
}
}
const pageMapCode = `const pageMap = new Map([
${pageMap.join(",\n ")}
]);
export { pageMap };`;
return { code: [...imports, pageMapCode].join("\n") };
}
}
};
}
export {
VIRTUAL_PAGES_MODULE_ID,
pluginPages
};