From 5830864949a21c20bc004e51fbe23e97cc9560f4 Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Mon, 13 Apr 2026 13:34:10 -0400 Subject: [PATCH 1/4] Surface console output from workerd during prerendering --- .changeset/cloudflare-prerender-console-output.md | 5 +++++ packages/integrations/cloudflare/src/prerenderer.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/cloudflare-prerender-console-output.md diff --git a/.changeset/cloudflare-prerender-console-output.md b/.changeset/cloudflare-prerender-console-output.md new file mode 100644 index 000000000000..3e019e4a7925 --- /dev/null +++ b/.changeset/cloudflare-prerender-console-output.md @@ -0,0 +1,5 @@ +--- +'@astrojs/cloudflare': patch +--- + +Surfaces `console.log` and `console.warn` output from workerd during prerendering diff --git a/packages/integrations/cloudflare/src/prerenderer.ts b/packages/integrations/cloudflare/src/prerenderer.ts index f55a8a9a036e..dd9b0f803f8d 100644 --- a/packages/integrations/cloudflare/src/prerenderer.ts +++ b/packages/integrations/cloudflare/src/prerenderer.ts @@ -61,7 +61,7 @@ export function createCloudflarePrerenderer({ outDir: fileURLToPath(serverDir), }, root: fileURLToPath(root), - logLevel: 'error', + logLevel: 'info', preview: { host: 'localhost', port: 0, // Let the OS pick a free port From 9cf9d59be4c0cfe04d413e8a47c3eb03b5ee5176 Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Tue, 14 Apr 2026 08:40:41 -0400 Subject: [PATCH 2/4] Filter out HTTP request logs from prerender server output --- .../integrations/cloudflare/src/prerenderer.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/integrations/cloudflare/src/prerenderer.ts b/packages/integrations/cloudflare/src/prerenderer.ts index dd9b0f803f8d..8564522e9226 100644 --- a/packages/integrations/cloudflare/src/prerenderer.ts +++ b/packages/integrations/cloudflare/src/prerenderer.ts @@ -4,7 +4,7 @@ import type { AssetsGlobalStaticImagesList, PathWithRoute, } from 'astro'; -import { preview, type PreviewServer as VitePreviewServer } from 'vite'; +import { preview, createLogger, 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'; @@ -53,6 +53,20 @@ export function createCloudflarePrerenderer({ // Ensure client dir exists (CF plugin expects it for assets) await mkdir(clientDir, { recursive: true }); + // Create a custom logger that filters out HTTP request logs (e.g. "POST /__astro_prerender 200 OK") + // from the Cloudflare vite plugin while still allowing user console.log output to pass through. + // We strip ANSI codes before testing because the Cloudflare vite plugin wraps messages in color codes. + const defaultLogger = createLogger('info'); + const ansiRe = /\x1b\[[0-9;]*m/g; + const requestLogRe = /^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s+\S+\s+\d+\s+/; + const customLogger: ReturnType = { + ...defaultLogger, + info(msg, opts) { + if (requestLogRe.test(msg.replace(ansiRe, ''))) return; + defaultLogger.info(msg, opts); + }, + }; + previewServer = await preview({ configFile: false, base, @@ -61,7 +75,7 @@ export function createCloudflarePrerenderer({ outDir: fileURLToPath(serverDir), }, root: fileURLToPath(root), - logLevel: 'info', + customLogger, preview: { host: 'localhost', port: 0, // Let the OS pick a free port From 7a41aca6119c43212ca000b843a1b9e19998858a Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Tue, 14 Apr 2026 09:00:56 -0400 Subject: [PATCH 3/4] Narrow log filter to only match internal __astro_ request paths --- packages/integrations/cloudflare/src/prerenderer.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/integrations/cloudflare/src/prerenderer.ts b/packages/integrations/cloudflare/src/prerenderer.ts index 8564522e9226..a931dd8e0ebf 100644 --- a/packages/integrations/cloudflare/src/prerenderer.ts +++ b/packages/integrations/cloudflare/src/prerenderer.ts @@ -53,16 +53,16 @@ export function createCloudflarePrerenderer({ // Ensure client dir exists (CF plugin expects it for assets) await mkdir(clientDir, { recursive: true }); - // Create a custom logger that filters out HTTP request logs (e.g. "POST /__astro_prerender 200 OK") + // Create a custom logger that filters out internal HTTP request logs (e.g. "POST /__astro_prerender 200 OK") // from the Cloudflare vite plugin while still allowing user console.log output to pass through. // We strip ANSI codes before testing because the Cloudflare vite plugin wraps messages in color codes. const defaultLogger = createLogger('info'); const ansiRe = /\x1b\[[0-9;]*m/g; - const requestLogRe = /^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s+\S+\s+\d+\s+/; + const astroRequestLogRe = /^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s+\/__astro_/; const customLogger: ReturnType = { ...defaultLogger, info(msg, opts) { - if (requestLogRe.test(msg.replace(ansiRe, ''))) return; + if (astroRequestLogRe.test(msg.replace(ansiRe, ''))) return; defaultLogger.info(msg, opts); }, }; From 5a656c66201bb76e60f4cb1266841876c6bc1fbf Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Tue, 14 Apr 2026 09:32:47 -0400 Subject: [PATCH 4/4] Fix lint: disable no-control-regex for ANSI pattern, use non-capturing group --- packages/integrations/cloudflare/src/prerenderer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/integrations/cloudflare/src/prerenderer.ts b/packages/integrations/cloudflare/src/prerenderer.ts index a931dd8e0ebf..f95c38eb4b2d 100644 --- a/packages/integrations/cloudflare/src/prerenderer.ts +++ b/packages/integrations/cloudflare/src/prerenderer.ts @@ -57,8 +57,9 @@ export function createCloudflarePrerenderer({ // from the Cloudflare vite plugin while still allowing user console.log output to pass through. // We strip ANSI codes before testing because the Cloudflare vite plugin wraps messages in color codes. const defaultLogger = createLogger('info'); + // eslint-disable-next-line no-control-regex const ansiRe = /\x1b\[[0-9;]*m/g; - const astroRequestLogRe = /^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s+\/__astro_/; + const astroRequestLogRe = /^(?:GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s+\/__astro_/; const customLogger: ReturnType = { ...defaultLogger, info(msg, opts) {