diff --git a/packages/start-client-core/src/createMiddleware.ts b/packages/start-client-core/src/createMiddleware.ts index d204b37c84..a637c2dbb2 100644 --- a/packages/start-client-core/src/createMiddleware.ts +++ b/packages/start-client-core/src/createMiddleware.ts @@ -760,19 +760,27 @@ export type RequestServerNextFn = < TServerContext = undefined, >( options?: RequestServerNextFnOptions, -) => RequestMiddlewareServerFnResult +) => RequestServerNextFnResult export interface RequestServerNextFnOptions { context?: TServerContext } +export type RequestServerNextFnResult = + + | Promise> + | RequestServerResult + export type RequestMiddlewareServerFnResult< TRegister, TMiddlewares, TServerContext, > = - | Promise> + | Promise< + RequestServerResult | Response + > | RequestServerResult + | Response export interface RequestServerResult { request: Request diff --git a/packages/start-client-core/src/tests/createServerMiddleware.test-d.ts b/packages/start-client-core/src/tests/createServerMiddleware.test-d.ts index 6e4fb8e27f..9759e39d06 100644 --- a/packages/start-client-core/src/tests/createServerMiddleware.test-d.ts +++ b/packages/start-client-core/src/tests/createServerMiddleware.test-d.ts @@ -741,3 +741,53 @@ test('createMiddleware with type request, middleware and context', () => { return result }) }) + +test('createMiddleware with type request can return Response directly', () => { + createMiddleware({ type: 'request' }).server(async (options) => { + expectTypeOf(options).toEqualTypeOf<{ + request: Request + next: RequestServerNextFn<{}, undefined> + pathname: string + context: undefined + }>() + + // Should be able to return a Response directly + if (Math.random() > 0.5) { + return new Response('Unauthorized', { status: 401 }) + } + + // Or return the result from next() + return options.next() + }) +}) + +test('createMiddleware with type request can return Promise', () => { + createMiddleware({ type: 'request' }).server(async (options) => { + expectTypeOf(options).toEqualTypeOf<{ + request: Request + next: RequestServerNextFn<{}, undefined> + pathname: string + context: undefined + }>() + + // Should be able to return a Promise + return Promise.resolve(new Response('OK', { status: 200 })) + }) +}) + +test('createMiddleware with type request can return sync Response', () => { + createMiddleware({ type: 'request' }).server((options) => { + expectTypeOf(options).toEqualTypeOf<{ + request: Request + next: RequestServerNextFn<{}, undefined> + pathname: string + context: undefined + }>() + + // Should be able to return a synchronous Response + return new Response(JSON.stringify({ error: 'Not Found' }), { + status: 404, + headers: { 'Content-Type': 'application/json' }, + }) + }) +})