Home / File/ pages.ts — astro Source File

pages.ts — astro Source File

Architecture documentation for pages.ts, a typescript file in the astro codebase. 8 imports, 0 dependents.

File typescript CoreAstro RenderingEngine 8 imports 2 functions

Entity Profile

Dependency Diagram

graph LR
  6e737d15_0195_e062_7c54_997ea919572e["pages.ts"]
  313916b3_64e3_9a00_0504_f5123ae24ad8["../core/routing/default.js"]
  6e737d15_0195_e062_7c54_997ea919572e --> 313916b3_64e3_9a00_0504_f5123ae24ad8
  c923dac6_4ccb_a783_dee2_4bc95f0ebcf1["../core/routing/index.js"]
  6e737d15_0195_e062_7c54_997ea919572e --> c923dac6_4ccb_a783_dee2_4bc95f0ebcf1
  e9b74c5a_8d34_34a7_e196_5e41b87214aa["../types/astro.js"]
  6e737d15_0195_e062_7c54_997ea919572e --> e9b74c5a_8d34_34a7_e196_5e41b87214aa
  10d4e39f_edb6_3e34_aa93_ae1211e7da05["../types/public/internal.js"]
  6e737d15_0195_e062_7c54_997ea919572e --> 10d4e39f_edb6_3e34_aa93_ae1211e7da05
  c0c8a87f_ca88_4ea8_585b_2040cded1231["./const.js"]
  6e737d15_0195_e062_7c54_997ea919572e --> c0c8a87f_ca88_4ea8_585b_2040cded1231
  cf37a168_0cc0_cca0_ac64_5e7070a871a4["./util.js"]
  6e737d15_0195_e062_7c54_997ea919572e --> cf37a168_0cc0_cca0_ac64_5e7070a871a4
  7216d952_4e4a_2d18_a85b_74b4ace79e2b["../core/constants.js"]
  6e737d15_0195_e062_7c54_997ea919572e --> 7216d952_4e4a_2d18_a85b_74b4ace79e2b
  263e522e_1aa5_ebc3_e7d6_45ebc51671f7["vite"]
  6e737d15_0195_e062_7c54_997ea919572e --> 263e522e_1aa5_ebc3_e7d6_45ebc51671f7
  style 6e737d15_0195_e062_7c54_997ea919572e fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import type { Plugin as VitePlugin } from 'vite';
import { DEFAULT_COMPONENTS } from '../core/routing/default.js';
import { routeIsRedirect } from '../core/routing/index.js';
import type { RoutesList } from '../types/astro.js';
import type { RouteData } from '../types/public/internal.js';
import { VIRTUAL_PAGE_MODULE_ID } from './const.js';
import { getVirtualModulePageName } from './util.js';
import { ASTRO_VITE_ENVIRONMENT_NAMES } from '../core/constants.js';

export const VIRTUAL_PAGES_MODULE_ID = 'virtual:astro:pages';
const VIRTUAL_PAGES_RESOLVED_MODULE_ID = '\0' + VIRTUAL_PAGES_MODULE_ID;

interface PagesPluginOptions {
	routesList: RoutesList;
}

/**
 * Filters routes for a specific build environment.
 * Redirects need their target route included so the redirect response can be generated at runtime.
 */
function getRoutesForEnvironment(routes: RouteData[], isPrerender: boolean): Set<RouteData> {
	const result = new Set<RouteData>();
	for (const route of routes) {
		if (route.prerender === isPrerender) {
			result.add(route);
		}
		if (route.redirectRoute) {
			result.add(route.redirectRoute);
		}
	}
	return result;
}

export function pluginPages({ routesList }: PagesPluginOptions): VitePlugin {
	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: string[] = [];
				const pageMap: string[] = [];
				let i = 0;

				// Filter routes based on the build environment to reduce memory usage.
				// Each environment only builds the pages it needs:
				// - SSR environment: builds only on-demand rendered pages (prerender: false)
				// - Prerender environment: builds only static pages (prerender: true)
				// - Other environments (e.g. client): get all routes
				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;
					}

					// Skip default components (404, server islands, etc.)
					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}`;
						// use the non-resolved ID to resolve correctly the virtual module
						imports.push(`const ${variable} = () => import("${virtualModuleName}");`);
						pageMap.push(`[${JSON.stringify(route.component)}, ${variable}]`);
						i++;
					}
				}

				const pageMapCode = `const pageMap = new Map([\n    ${pageMap.join(',\n    ')}\n]);\n\nexport { pageMap };`;
				return { code: [...imports, pageMapCode].join('\n') };
			},
		},
	};
}

Domain

Subdomains

Dependencies

  • ../core/constants.js
  • ../core/routing/default.js
  • ../core/routing/index.js
  • ../types/astro.js
  • ../types/public/internal.js
  • ./const.js
  • ./util.js
  • vite

Frequently Asked Questions

What does pages.ts do?
pages.ts is a source file in the astro codebase, written in typescript. It belongs to the CoreAstro domain, RenderingEngine subdomain.
What functions are defined in pages.ts?
pages.ts defines 2 function(s): getRoutesForEnvironment, pluginPages.
What does pages.ts depend on?
pages.ts imports 8 module(s): ../core/constants.js, ../core/routing/default.js, ../core/routing/index.js, ../types/astro.js, ../types/public/internal.js, ./const.js, ./util.js, vite.
Where is pages.ts in the architecture?
pages.ts is located at packages/astro/src/vite-plugin-pages/pages.ts (domain: CoreAstro, subdomain: RenderingEngine, directory: packages/astro/src/vite-plugin-pages).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free