From 1568afb78a163db63a4cde146dec87785a83db1d Mon Sep 17 00:00:00 2001 From: Arsh <69170106+lilnasy@users.noreply.github.com> Date: Thu, 1 Feb 2024 21:46:42 +0000 Subject: [PATCH] fix(middleware): load while retrieving ssr manifest for prerendering (#9938) * fix(middleware): load while retrieving ssr manifest for prerendering * add test * add changeset --- .changeset/shaggy-sloths-mix.md | 5 +++++ packages/astro/src/core/build/buildPipeline.ts | 8 ++++++++ .../test/fixtures/middleware space/src/middleware.js | 2 ++ .../fixtures/middleware space/src/pages/prerendered.astro | 4 ++++ packages/astro/test/middleware.test.js | 5 +++++ 5 files changed, 24 insertions(+) create mode 100644 .changeset/shaggy-sloths-mix.md create mode 100644 packages/astro/test/fixtures/middleware space/src/pages/prerendered.astro diff --git a/.changeset/shaggy-sloths-mix.md b/.changeset/shaggy-sloths-mix.md new file mode 100644 index 000000000000..d964d5cc2f29 --- /dev/null +++ b/.changeset/shaggy-sloths-mix.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes a regression where middleware did not run for prerendered pages and endpoints. diff --git a/packages/astro/src/core/build/buildPipeline.ts b/packages/astro/src/core/build/buildPipeline.ts index c5a499d7023a..ebbb4bba685f 100644 --- a/packages/astro/src/core/build/buildPipeline.ts +++ b/packages/astro/src/core/build/buildPipeline.ts @@ -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." @@ -133,6 +140,7 @@ export class BuildPipeline extends Pipeline { return { ...manifest, renderers: renderers.renderers as SSRLoadedRenderer[], + middleware }; } diff --git a/packages/astro/test/fixtures/middleware space/src/middleware.js b/packages/astro/test/fixtures/middleware space/src/middleware.js index 1404169ef96c..6310994554ea 100644 --- a/packages/astro/test/fixtures/middleware space/src/middleware.js +++ b/packages/astro/test/fixtures/middleware space/src/middleware.js @@ -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'); diff --git a/packages/astro/test/fixtures/middleware space/src/pages/prerendered.astro b/packages/astro/test/fixtures/middleware space/src/pages/prerendered.astro new file mode 100644 index 000000000000..0bf043ddfe5f --- /dev/null +++ b/packages/astro/test/fixtures/middleware space/src/pages/prerendered.astro @@ -0,0 +1,4 @@ +--- +export const prerender = true +--- +

{Astro.locals.canBeReadDuringPrerendering}

\ No newline at end of file diff --git a/packages/astro/test/middleware.test.js b/packages/astro/test/middleware.test.js index 64dc29cd9150..5f2153217ae8 100644 --- a/packages/astro/test/middleware.test.js +++ b/packages/astro/test/middleware.test.js @@ -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('

yes they can!

')).to.be.true; + }) + // keep this last it('the integration should receive the path to the middleware', async () => { fixture = await loadFixture({