From 2f1e65387afa6ee70c05a72c194a7237381005db Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Thu, 25 May 2023 12:57:34 -0400 Subject: [PATCH 1/2] Test that redirects can come from middleware --- .../test/fixtures/ssr-redirect/src/middleware.ts | 13 +++++++++++++ .../src/pages/middleware-redirect.astro | 10 ++++++++++ packages/astro/test/redirects.test.js | 11 ++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 packages/astro/test/fixtures/ssr-redirect/src/middleware.ts create mode 100644 packages/astro/test/fixtures/ssr-redirect/src/pages/middleware-redirect.astro diff --git a/packages/astro/test/fixtures/ssr-redirect/src/middleware.ts b/packages/astro/test/fixtures/ssr-redirect/src/middleware.ts new file mode 100644 index 000000000000..5f8243a43d09 --- /dev/null +++ b/packages/astro/test/fixtures/ssr-redirect/src/middleware.ts @@ -0,0 +1,13 @@ +import { defineMiddleware } from 'astro/middleware'; + +export const onRequest = defineMiddleware(({ request }, next) => { + if(new URL(request.url).pathname === '/middleware-redirect/') { + return new Response(null, { + status: 301, + headers: { + 'Location': '/' + } + }); + } + return next(); +}); diff --git a/packages/astro/test/fixtures/ssr-redirect/src/pages/middleware-redirect.astro b/packages/astro/test/fixtures/ssr-redirect/src/pages/middleware-redirect.astro new file mode 100644 index 000000000000..04f62cd89d45 --- /dev/null +++ b/packages/astro/test/fixtures/ssr-redirect/src/pages/middleware-redirect.astro @@ -0,0 +1,10 @@ +--- +--- + + + This page should have been redirected + + +

This page should have been redirected

+ + diff --git a/packages/astro/test/redirects.test.js b/packages/astro/test/redirects.test.js index fde343bcf7ea..df041baa2b07 100644 --- a/packages/astro/test/redirects.test.js +++ b/packages/astro/test/redirects.test.js @@ -14,7 +14,7 @@ describe('Astro.redirect', () => { adapter: testAdapter(), redirects: { '/api/redirect': '/' - } + }, }); await fixture.build(); }); @@ -67,6 +67,9 @@ describe('Astro.redirect', () => { fixture = await loadFixture({ root: './fixtures/ssr-redirect/', output: 'static', + experimental: { + middleware: true + }, redirects: { '/one': '/', '/two': '/', @@ -109,5 +112,11 @@ describe('Astro.redirect', () => { expect(html).to.include('http-equiv="refresh'); expect(html).to.include('url=/articles/two'); }); + + it('Generates redirect pages for redirects created by middleware', async () => { + let html = await fixture.readFile('/middleware-redirect/index.html'); + expect(html).to.include('http-equiv="refresh'); + expect(html).to.include('url=/'); + }); }); }); From 7351c0b275f9c84481c77052687d415707b3bdbb Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Thu, 25 May 2023 12:59:46 -0400 Subject: [PATCH 2/2] Allow non-promise returns for middleware --- packages/astro/src/@types/astro.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 437cf4c385e7..fefdec2bfde2 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -1805,7 +1805,7 @@ export type MiddlewareNext = () => Promise; export type MiddlewareHandler = ( context: APIContext, next: MiddlewareNext -) => Promise | Promise | void; +) => Promise | R | Promise | void; export type MiddlewareResponseHandler = MiddlewareHandler; export type MiddlewareEndpointHandler = MiddlewareHandler;