From 374a7b53ac1a6970e9e353c6d5bc64fa62947e09 Mon Sep 17 00:00:00 2001 From: itosa-kazu Date: Wed, 10 Jun 2026 08:41:13 +0900 Subject: [PATCH 1/3] fix(astro): resolve middleware export types --- packages/astro/package.json | 2 +- .../astro/src/integration/middleware/index.ts | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/astro/package.json b/packages/astro/package.json index 370cd8bee29d..4539479195a0 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -33,7 +33,7 @@ "require": "./build/cjs/index.server.js" }, "./middleware": { - "types": "./build/types/integration/middleware/index.types.d.ts", + "types": "./build/types/integration/middleware/index.d.ts", "node": "./build/esm/integration/middleware/index.js", "import": "./build/esm/integration/middleware/index.js", "require": "./build/cjs/integration/middleware/index.js" diff --git a/packages/astro/src/integration/middleware/index.ts b/packages/astro/src/integration/middleware/index.ts index 46c7ad9531b5..8c8cf1d59e2e 100644 --- a/packages/astro/src/integration/middleware/index.ts +++ b/packages/astro/src/integration/middleware/index.ts @@ -1,6 +1,11 @@ -import type { MiddlewareResponseHandler } from 'astro'; import { handleRequest } from '../../server/middleware'; +type MiddlewareNext = (rewritePayload?: unknown) => Promise; +type MiddlewareHandler = ( + ctx: unknown, + next: MiddlewareNext, +) => Promise | Response | Promise | void; + /** * This export is used by our integration to automatically add the middleware * to astro ^3.5.0 projects. @@ -10,6 +15,11 @@ import { handleRequest } from '../../server/middleware'; * middleware registration in our integration and manually add it in their own * `/src/middleware.js` file. */ -export const onRequest: MiddlewareResponseHandler = (ctx, next) => { - return handleRequest()(ctx, next); +export const onRequest: MiddlewareHandler = (ctx, next) => { + const middleware = handleRequest(); + + return middleware( + ctx as Parameters[0], + next as Parameters[1], + ); }; From e5547676fd8dcb3a1258be3fc4cae2c7456ec35f Mon Sep 17 00:00:00 2001 From: Andrei <168741329+andreiborza@users.noreply.github.com> Date: Wed, 10 Jun 2026 14:05:22 +0200 Subject: [PATCH 2/3] Update packages/astro/src/integration/middleware/index.ts --- packages/astro/src/integration/middleware/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/integration/middleware/index.ts b/packages/astro/src/integration/middleware/index.ts index 8c8cf1d59e2e..725bf0219966 100644 --- a/packages/astro/src/integration/middleware/index.ts +++ b/packages/astro/src/integration/middleware/index.ts @@ -1,6 +1,6 @@ import { handleRequest } from '../../server/middleware'; -type MiddlewareNext = (rewritePayload?: unknown) => Promise; +type MiddlewareNext = () => Promise; type MiddlewareHandler = ( ctx: unknown, next: MiddlewareNext, From 1810faf8353741b59724e189680a2e7fccf1a7c5 Mon Sep 17 00:00:00 2001 From: Andrei Borza Date: Wed, 10 Jun 2026 14:24:26 +0200 Subject: [PATCH 3/3] Formatting fixes and ignore removal --- .../astro/src/integration/middleware/index.ts | 15 +++++++-------- .../integration/middleware/index.test-d.ts | 18 ++++++++++++++++++ .../test/integration/middleware/index.test.ts | 2 +- 3 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 packages/astro/test/integration/middleware/index.test-d.ts diff --git a/packages/astro/src/integration/middleware/index.ts b/packages/astro/src/integration/middleware/index.ts index 725bf0219966..0208290c2733 100644 --- a/packages/astro/src/integration/middleware/index.ts +++ b/packages/astro/src/integration/middleware/index.ts @@ -1,10 +1,7 @@ import { handleRequest } from '../../server/middleware'; type MiddlewareNext = () => Promise; -type MiddlewareHandler = ( - ctx: unknown, - next: MiddlewareNext, -) => Promise | Response | Promise | void; +type MiddlewareHandler = (ctx: unknown, next: MiddlewareNext) => Promise | Response | Promise | void; /** * This export is used by our integration to automatically add the middleware @@ -18,8 +15,10 @@ type MiddlewareHandler = ( export const onRequest: MiddlewareHandler = (ctx, next) => { const middleware = handleRequest(); - return middleware( - ctx as Parameters[0], - next as Parameters[1], - ); + // `onRequest` deliberately uses framework-agnostic parameter types so the published + // `@sentry/astro/middleware` declaration does not reference Astro-version-specific types + // (e.g. `MiddlewareResponseHandler`, which is absent in some supported Astro versions). + // The handler returned by `handleRequest()` is typed against Astro's own types, so we cast + // back to its expected parameter types here – the runtime shapes are identical. + return middleware(ctx as Parameters[0], next as Parameters[1]); }; diff --git a/packages/astro/test/integration/middleware/index.test-d.ts b/packages/astro/test/integration/middleware/index.test-d.ts new file mode 100644 index 000000000000..5f482f98746e --- /dev/null +++ b/packages/astro/test/integration/middleware/index.test-d.ts @@ -0,0 +1,18 @@ +import { describe, expectTypeOf, it } from 'vitest'; +import { onRequest } from '../../../src/integration/middleware'; + +describe('Integration middleware types', () => { + // Regression test for #21413: the published `@sentry/astro/middleware` declaration must stay + // framework-agnostic. Typing `onRequest` against Astro-version-specific aliases (such as + // `MiddlewareResponseHandler`) made the public type depend on an export that is absent in some + // supported Astro versions. The assertions below fail on that previous typing and pass with the fix. + it('exposes onRequest as a framework-agnostic middleware handler', () => { + expectTypeOf(onRequest).toBeFunction(); + expectTypeOf(onRequest).parameters.toEqualTypeOf<[unknown, () => Promise]>(); + expectTypeOf(onRequest).returns.toEqualTypeOf | Response | Promise | void>(); + }); + + it('is callable with a minimal context and a zero-argument next', () => { + expectTypeOf(onRequest).toBeCallableWith({}, () => Promise.resolve(new Response())); + }); +}); diff --git a/packages/astro/test/integration/middleware/index.test.ts b/packages/astro/test/integration/middleware/index.test.ts index 2a63a66027e8..1ce7b8d8e9b9 100644 --- a/packages/astro/test/integration/middleware/index.test.ts +++ b/packages/astro/test/integration/middleware/index.test.ts @@ -24,7 +24,7 @@ describe('Integration middleware', () => { id: '123', }, }; - // @ts-expect-error - a partial ctx object is fine here + // `onRequest` accepts a framework-agnostic `ctx`, so a partial Astro context is fine here. const res = await onRequest(ctx, next); expect(res).toBeDefined();