Skip to content

Commit

Permalink
fix(middleware): load while retrieving ssr manifest for prerendering (#…
Browse files Browse the repository at this point in the history
…9938)

* fix(middleware): load while retrieving ssr manifest for prerendering

* add test

* add changeset
  • Loading branch information
lilnasy committed Feb 1, 2024
1 parent 055bd27 commit 1568afb
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .changeset/shaggy-sloths-mix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"astro": patch
---

Fixes a regression where middleware did not run for prerendered pages and endpoints.
8 changes: 8 additions & 0 deletions packages/astro/src/core/build/buildPipeline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,13 @@ export class BuildPipeline extends Pipeline {

const renderersEntryUrl = new URL(`renderers.mjs?time=${Date.now()}`, baseDirectory);
const renderers = await import(renderersEntryUrl.toString());

const middleware = await import(new URL('middleware.mjs', baseDirectory).toString())
.then((mod) => mod.onRequest)
// middleware.mjs is not emitted if there is no user middleware
// in which case the import fails with ERR_MODULE_NOT_FOUND, and we fall back to a no-op middleware
.catch(() => manifest.middleware);

if (!renderers) {
throw new Error(
"Astro couldn't find the emitted renderers. This is an internal error, please file an issue."
Expand All @@ -133,6 +140,7 @@ export class BuildPipeline extends Pipeline {
return {
...manifest,
renderers: renderers.renderers as SSRLoadedRenderer[],
middleware
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ const first = defineMiddleware(async (context, next) => {
status: 200,
headers: response.headers,
});
} else if (context.url.pathname === '/prerendered/') {
context.locals.canBeReadDuringPrerendering = "yes they can!";
} else {
if (context.url.pathname === '/') {
context.cookies.set('foo', 'bar');
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
export const prerender = true
---
<p>{Astro.locals.canBeReadDuringPrerendering}</p>
5 changes: 5 additions & 0 deletions packages/astro/test/middleware.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,11 @@ describe('Middleware API in PROD mode, SSR', () => {
expect(response.headers.get('content-type')).equal('text/html');
});

it('can set locals for prerendered pages to use', async () => {
const text = await fixture.readFile("/client/prerendered/index.html")
expect(text.includes('<p>yes they can!</p>')).to.be.true;
})

// keep this last
it('the integration should receive the path to the middleware', async () => {
fixture = await loadFixture({
Expand Down

0 comments on commit 1568afb

Please sign in to comment.