diff --git a/examples/ssr/src/pages/index.astro b/examples/ssr/src/pages/index.astro index 23a4c2721a..a8f95588b4 100644 --- a/examples/ssr/src/pages/index.astro +++ b/examples/ssr/src/pages/index.astro @@ -6,6 +6,8 @@ import { getProducts } from '../api'; import '../styles/common.css'; const products = await getProducts(Astro.request); + +return; --- diff --git a/packages/astro/src/runtime/server/render/page.ts b/packages/astro/src/runtime/server/render/page.ts index 9648a94bdb..f8ab70f4cb 100644 --- a/packages/astro/src/runtime/server/render/page.ts +++ b/packages/astro/src/runtime/server/render/page.ts @@ -112,7 +112,12 @@ export async function renderPage( let response = createResponse(body, { ...init, headers }); return response; - } else { - return factoryReturnValue; } + + // We double check if the file return a Response + if (!(factoryReturnValue instanceof Response)) { + throw new Error('Only instance of Response can be returned from an Astro file'); + } + + return factoryReturnValue; } diff --git a/packages/astro/test/astro-not-response.test.js b/packages/astro/test/astro-not-response.test.js new file mode 100644 index 0000000000..76c7e5c35b --- /dev/null +++ b/packages/astro/test/astro-not-response.test.js @@ -0,0 +1,35 @@ +import { expect, assert } from 'chai'; +import { loadFixture } from './test-utils.js'; + +// Asset bundling +describe('Not returning responses', () => { + let fixture; + /** @type {import('./test-utils').DevServer} */ + let devServer; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/astro-not-response/', + }); + + devServer = await fixture.startDevServer(); + }); + + after(async () => { + await devServer.stop(); + }); + + it('Does not work from a page', async () => { + try { + await fixture.build(); + } catch (e) { + expect(e).to.be.instanceOf( + Error, + 'Only instance of Response can be returned from an Astro file' + ); + return null; + } + + assert.fail('Should have thrown an error'); + }); +}); diff --git a/packages/astro/test/fixtures/astro-not-response/package.json b/packages/astro/test/fixtures/astro-not-response/package.json new file mode 100644 index 0000000000..31eeb4e681 --- /dev/null +++ b/packages/astro/test/fixtures/astro-not-response/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/astro-not-response", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/astro-not-response/src/pages/not-response.astro b/packages/astro/test/fixtures/astro-not-response/src/pages/not-response.astro new file mode 100644 index 0000000000..cd7aef969c --- /dev/null +++ b/packages/astro/test/fixtures/astro-not-response/src/pages/not-response.astro @@ -0,0 +1,3 @@ +--- +return null; +--- diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e4d1701830..3a3859003b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1335,6 +1335,12 @@ importers: dependencies: astro: link:../../.. + packages/astro/test/fixtures/astro-not-response: + specifiers: + astro: workspace:* + dependencies: + astro: link:../../.. + packages/astro/test/fixtures/astro-page-directory-url: specifiers: astro: workspace:*