diff --git a/.changeset/cool-bulldogs-change.md b/.changeset/cool-bulldogs-change.md new file mode 100644 index 000000000000..fce9c1a2119c --- /dev/null +++ b/.changeset/cool-bulldogs-change.md @@ -0,0 +1,7 @@ +--- +"astro": patch +--- + +This patch allows astro to run in node-compat mode in Deno. Deno doesn't support +construction of response from async iterables in node-compat mode so we need to +use ReadableStream. diff --git a/packages/astro/src/runtime/server/render/page.ts b/packages/astro/src/runtime/server/render/page.ts index c27c11e6d3ac..e6852fa2a0ce 100644 --- a/packages/astro/src/runtime/server/render/page.ts +++ b/packages/astro/src/runtime/server/render/page.ts @@ -5,7 +5,7 @@ import type { AstroComponentFactory } from './index.js'; import { isAstroComponentFactory } from './astro/index.js'; import { renderToAsyncIterable, renderToReadableStream, renderToString } from './astro/render.js'; import { encoder } from './common.js'; -import { isNode } from './util.js'; +import { isNode, isDeno } from './util.js'; export async function renderPage( result: SSRResult, @@ -48,7 +48,9 @@ export async function renderPage( let body: BodyInit | Response; if (streaming) { - if (isNode) { + // isNode is true in Deno node-compat mode but response construction from + // async iterables is not supported, so we fallback to ReadableStream if isDeno is true. + if (isNode && !isDeno) { const nodeBody = await renderToAsyncIterable( result, componentFactory, diff --git a/packages/astro/src/runtime/server/render/util.ts b/packages/astro/src/runtime/server/render/util.ts index 484a8bbbb274..61caff6cc6b0 100644 --- a/packages/astro/src/runtime/server/render/util.ts +++ b/packages/astro/src/runtime/server/render/util.ts @@ -207,6 +207,8 @@ export function renderToBufferDestination(bufferRenderFunction: RenderFunction): export const isNode = typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]'; +// @ts-expect-error: Deno is not part of the types. +export const isDeno = typeof Deno !== 'undefined'; // We can get rid of this when Promise.withResolvers() is ready export type PromiseWithResolvers = {