summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHiDeoo2025-02-20 00:13:33 +0100
committerGitHub2025-02-20 00:13:33 +0100
commitec5ca5953e62b6ad2de78996d37e08522aa4aa76 (patch)
tree717730815c062c47ef80261ab61c04c057c81f53
parent070ec8be3812d3f750a1e2a56b8043049b05ea48 (diff)
downloadIT.starlight-ec5ca5953e62b6ad2de78996d37e08522aa4aa76.tar.gz
IT.starlight-ec5ca5953e62b6ad2de78996d37e08522aa4aa76.tar.bz2
IT.starlight-ec5ca5953e62b6ad2de78996d37e08522aa4aa76.zip
Fix issue with rewriting (#2904)
Co-authored-by: Chris Swithinbank <swithinbank@gmail.com>
-rw-r--r--.changeset/forty-ways-beam.md5
-rw-r--r--packages/starlight/__e2e__/fixtures/ssr/src/middleware.ts8
-rw-r--r--packages/starlight/__e2e__/ssr.test.ts8
-rw-r--r--packages/starlight/locals.ts1
4 files changed, 22 insertions, 0 deletions
diff --git a/.changeset/forty-ways-beam.md b/.changeset/forty-ways-beam.md
new file mode 100644
index 00000000..8ab92cb9
--- /dev/null
+++ b/.changeset/forty-ways-beam.md
@@ -0,0 +1,5 @@
+---
+'@astrojs/starlight': patch
+---
+
+Fixes an issue preventing the use of [rewrites](https://docs.astro.build/en/guides/routing/#rewrites).
diff --git a/packages/starlight/__e2e__/fixtures/ssr/src/middleware.ts b/packages/starlight/__e2e__/fixtures/ssr/src/middleware.ts
new file mode 100644
index 00000000..621cb87a
--- /dev/null
+++ b/packages/starlight/__e2e__/fixtures/ssr/src/middleware.ts
@@ -0,0 +1,8 @@
+import { defineMiddleware } from 'astro:middleware';
+
+export const onRequest = defineMiddleware((context, next) => {
+ if (context.url.pathname === '/content') {
+ return context.rewrite('/demo');
+ }
+ return next();
+});
diff --git a/packages/starlight/__e2e__/ssr.test.ts b/packages/starlight/__e2e__/ssr.test.ts
index 1bfd6d43..1c21e0a1 100644
--- a/packages/starlight/__e2e__/ssr.test.ts
+++ b/packages/starlight/__e2e__/ssr.test.ts
@@ -54,6 +54,14 @@ test('SSR mode renders the same splash page as prerendering', async ({
expectEquivalentHTML(prerenderContent, ssrContent);
});
+test('supports middleware rewriting', async ({ page, getProdServer }) => {
+ const starlight = await getProdServer();
+ const response = await starlight.goto('/content');
+
+ expect(response?.status()).toBe(200);
+ await expect(page.locator('#server-check')).toHaveText('On server');
+});
+
function expectEquivalentHTML(a: string, b: string) {
expect(getNormalizedHTML(a)).toEqual(getNormalizedHTML(b));
}
diff --git a/packages/starlight/locals.ts b/packages/starlight/locals.ts
index 5337f586..29088d26 100644
--- a/packages/starlight/locals.ts
+++ b/packages/starlight/locals.ts
@@ -20,6 +20,7 @@ export const onRequest = defineMiddleware(async (context, next) => {
* avoid generating route data in this middleware which also runs for non-Starlight route.
*/
export function initializeStarlightRoute(context: APIContext) {
+ if ('starlightRoute' in context.locals) return;
const state: { routeData: StarlightRouteData | undefined } = { routeData: undefined };
Object.defineProperty(context.locals, 'starlightRoute', {
get() {