summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/shaggy-sloths-mix.md5
-rw-r--r--packages/astro/src/core/build/buildPipeline.ts8
-rw-r--r--packages/astro/test/fixtures/middleware space/src/middleware.js2
-rw-r--r--packages/astro/test/fixtures/middleware space/src/pages/prerendered.astro4
-rw-r--r--packages/astro/test/middleware.test.js5
5 files changed, 24 insertions, 0 deletions
diff --git a/.changeset/shaggy-sloths-mix.md b/.changeset/shaggy-sloths-mix.md
new file mode 100644
index 000000000..d964d5cc2
--- /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 c5a499d70..ebbb4bba6 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 1404169ef..631099455 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 000000000..0bf043ddf
--- /dev/null
+++ b/packages/astro/test/fixtures/middleware space/src/pages/prerendered.astro
@@ -0,0 +1,4 @@
+---
+export const prerender = true
+---
+<p>{Astro.locals.canBeReadDuringPrerendering}</p> \ No newline at end of file
diff --git a/packages/astro/test/middleware.test.js b/packages/astro/test/middleware.test.js
index 64dc29cd9..5f2153217 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('<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({