Home / File/ prerenderer.ts — astro Source File

prerenderer.ts — astro Source File

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

File typescript CoreAstro RoutingSystem 9 imports 1 functions

Entity Profile

Dependency Diagram

graph LR
  ea6368b4_dbad_1087_375b_000717fdb94e["prerenderer.ts"]
  22f5c3b0_9997_c1be_8811_a6d4604ad86a["./wrangler.js"]
  ea6368b4_dbad_1087_375b_000717fdb94e --> 22f5c3b0_9997_c1be_8811_a6d4604ad86a
  88f8942a_0ab8_2f50_3bcb_dd20bdb8a6be["../prerender-types.js"]
  ea6368b4_dbad_1087_375b_000717fdb94e --> 88f8942a_0ab8_2f50_3bcb_dd20bdb8a6be
  eaea7968_cb26_203a_633b_da660ec7d738["./prerender-constants.js"]
  ea6368b4_dbad_1087_375b_000717fdb94e --> eaea7968_cb26_203a_633b_da660ec7d738
  f16d8c76_2866_6150_bd14_0347b59abfe9["astro"]
  ea6368b4_dbad_1087_375b_000717fdb94e --> f16d8c76_2866_6150_bd14_0347b59abfe9
  263e522e_1aa5_ebc3_e7d6_45ebc51671f7["vite"]
  ea6368b4_dbad_1087_375b_000717fdb94e --> 263e522e_1aa5_ebc3_e7d6_45ebc51671f7
  d9a92db9_c95e_9165_13ac_24b3d859d946["node:url"]
  ea6368b4_dbad_1087_375b_000717fdb94e --> d9a92db9_c95e_9165_13ac_24b3d859d946
  5d6d1861_a18d_b246_cd94_08889ab7e74c["promises"]
  ea6368b4_dbad_1087_375b_000717fdb94e --> 5d6d1861_a18d_b246_cd94_08889ab7e74c
  cd61a25f_49b5_edd2_d556_1f8a13996d51["vite-plugin"]
  ea6368b4_dbad_1087_375b_000717fdb94e --> cd61a25f_49b5_edd2_d556_1f8a13996d51
  0875b428_b364_946e_8628_525c58afbb71["manifest"]
  ea6368b4_dbad_1087_375b_000717fdb94e --> 0875b428_b364_946e_8628_525c58afbb71
  style ea6368b4_dbad_1087_375b_000717fdb94e fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import type { AstroConfig, AstroPrerenderer, PathWithRoute } from 'astro';
import { preview, type PreviewServer as VitePreviewServer } from 'vite';
import { fileURLToPath } from 'node:url';
import { mkdir } from 'node:fs/promises';
import { cloudflare as cfVitePlugin, type PluginConfig } from '@cloudflare/vite-plugin';
import { cloudflareConfigCustomizer } from './wrangler.js';
import { serializeRouteData, deserializeRouteData } from 'astro/app/manifest';
import type { StaticPathsResponse, PrerenderRequest } from './prerender-types.js';
import { STATIC_PATHS_ENDPOINT, PRERENDER_ENDPOINT } from './utils/prerender-constants.js';

interface CloudflarePrerendererOptions {
	root: AstroConfig['root'];
	serverDir: AstroConfig['build']['server'];
	clientDir: AstroConfig['build']['client'];
	base: AstroConfig['base'];
	trailingSlash: AstroConfig['trailingSlash'];
}

/**
 * Creates a prerenderer that uses Cloudflare's workerd runtime via a preview server.
 * This allows prerendering to happen in the same runtime that will serve the pages.
 */
export function createCloudflarePrerenderer({
	root,
	serverDir,
	clientDir,
	base,
	trailingSlash,
}: CloudflarePrerendererOptions): AstroPrerenderer {
	let previewServer: VitePreviewServer | undefined;
	let serverUrl: string;

	return {
		name: '@astrojs/cloudflare:prerenderer',

		async setup() {
			// Ensure client dir exists (CF plugin expects it for assets)
			await mkdir(clientDir, { recursive: true });

			const cfPluginConfig: PluginConfig = {
				viteEnvironment: { name: 'prerender' },
				config: cloudflareConfigCustomizer(),
			};

			previewServer = await preview({
				configFile: false,
				base,
				appType: 'mpa',
				build: {
					outDir: fileURLToPath(serverDir),
				},
				root: fileURLToPath(root),
				preview: {
					host: 'localhost',
					port: 0, // Let the OS pick a free port
					open: false,
				},
				plugins: [cfVitePlugin(cfPluginConfig)],
			});

			const address = previewServer.httpServer.address();
			if (address && typeof address === 'object') {
				serverUrl = `http://localhost:${address.port}`;
			} else {
				throw new Error(
					'Failed to start the Cloudflare prerender server. The preview server did not return a valid address. ' +
						'This is likely a bug in @astrojs/cloudflare. Please file an issue at https://github.com/withastro/astro/issues',
				);
			}
		},

		async getStaticPaths(): Promise<PathWithRoute[]> {
			// Call the workerd endpoint to get static paths
			const response = await fetch(`${serverUrl}${STATIC_PATHS_ENDPOINT}`, {
				method: 'POST',
				headers: { 'Content-Type': 'application/json' },
			});

			if (!response.ok) {
				throw new Error(
					`Failed to get static paths from the Cloudflare prerender server (${response.status}: ${response.statusText}). ` +
						'This is likely a bug in @astrojs/cloudflare. Please file an issue at https://github.com/withastro/astro/issues',
				);
			}

			const data: StaticPathsResponse = await response.json();

			// Deserialize the routes
			return data.paths.map(({ pathname, route }) => ({
				pathname,
				route: deserializeRouteData(route),
			}));
		},

		async render(request, { routeData }) {
			// Serialize routeData and send to workerd
			const body: PrerenderRequest = {
				url: request.url,
				routeData: serializeRouteData(routeData, trailingSlash),
			};

			const response = await fetch(`${serverUrl}${PRERENDER_ENDPOINT}`, {
				method: 'POST',
				headers: { 'Content-Type': 'application/json' },
				body: JSON.stringify(body),
			});

			return response;
		},

		async teardown() {
			if (previewServer) {
				await previewServer.close();
				// Release reference to allow garbage collection
				previewServer = undefined;
			}
		},
	};
}

Domain

Subdomains

Dependencies

  • ../prerender-types.js
  • ./prerender-constants.js
  • ./wrangler.js
  • astro
  • manifest
  • node:url
  • promises
  • vite
  • vite-plugin

Frequently Asked Questions

What does prerenderer.ts do?
prerenderer.ts is a source file in the astro codebase, written in typescript. It belongs to the CoreAstro domain, RoutingSystem subdomain.
What functions are defined in prerenderer.ts?
prerenderer.ts defines 1 function(s): createCloudflarePrerenderer.
What does prerenderer.ts depend on?
prerenderer.ts imports 9 module(s): ../prerender-types.js, ./prerender-constants.js, ./wrangler.js, astro, manifest, node:url, promises, vite, and 1 more.
Where is prerenderer.ts in the architecture?
prerenderer.ts is located at packages/integrations/cloudflare/src/prerenderer.ts (domain: CoreAstro, subdomain: RoutingSystem, directory: packages/integrations/cloudflare/src).

Analyze Your Own Codebase

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

Try Supermodel Free