prerenderer.ts — astro Source File
Architecture documentation for prerenderer.ts, a typescript file in the astro codebase. 9 imports, 0 dependents.
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
Functions
Dependencies
- ../prerender-types.js
- ./prerender-constants.js
- ./wrangler.js
- astro
- manifest
- node:url
- promises
- vite
- vite-plugin
Source
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