diff --git a/.changeset/lazy-falcons-divide.md b/.changeset/lazy-falcons-divide.md new file mode 100644 index 0000000000..a705a78d46 --- /dev/null +++ b/.changeset/lazy-falcons-divide.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fix cookies not being set by middleware diff --git a/packages/astro/src/core/render/context.ts b/packages/astro/src/core/render/context.ts index d4efe35df3..90aaae0d20 100644 --- a/packages/astro/src/core/render/context.ts +++ b/packages/astro/src/core/render/context.ts @@ -1,4 +1,5 @@ import type { + AstroCookies, ComponentInstance, Params, Props, @@ -23,6 +24,7 @@ export interface RenderContext { componentMetadata?: SSRResult['componentMetadata']; route?: RouteData; status?: number; + cookies?: AstroCookies; params: Params; props: Props; } diff --git a/packages/astro/src/core/render/core.ts b/packages/astro/src/core/render/core.ts index 1973a84c39..e82c97e0bb 100644 --- a/packages/astro/src/core/render/core.ts +++ b/packages/astro/src/core/render/core.ts @@ -145,6 +145,7 @@ export async function renderPage({ scripts: renderContext.scripts, ssr: env.ssr, status: renderContext.status ?? 200, + cookies: apiContext?.cookies, locals, }); diff --git a/packages/astro/src/core/render/result.ts b/packages/astro/src/core/render/result.ts index ede30256e1..41a2fb9a44 100644 --- a/packages/astro/src/core/render/result.ts +++ b/packages/astro/src/core/render/result.ts @@ -53,6 +53,7 @@ export interface CreateResultArgs { request: Request; status: number; locals: App.Locals; + cookies?: AstroCookies; } function getFunctionExpression(slot: any) { @@ -155,7 +156,7 @@ export function createResult(args: CreateResultArgs): SSRResult { }); // Astro.cookies is defined lazily to avoid the cost on pages that do not use it. - let cookies: AstroCookies | undefined = undefined; + let cookies: AstroCookies | undefined = args.cookies; let componentMetadata = args.componentMetadata ?? new Map(); // Create the result object that will be passed into the render function. diff --git a/packages/astro/test/fixtures/middleware-dev/src/middleware.js b/packages/astro/test/fixtures/middleware-dev/src/middleware.js index c8b440239e..2cc7cf2ca5 100644 --- a/packages/astro/test/fixtures/middleware-dev/src/middleware.js +++ b/packages/astro/test/fixtures/middleware-dev/src/middleware.js @@ -19,6 +19,10 @@ const first = defineMiddleware(async (context, next) => { headers: response.headers, }); } else { + if(context.url.pathname === '/') { + context.cookies.set('foo', 'bar'); + } + context.locals.name = 'bar'; } return await next(); diff --git a/packages/astro/test/middleware.test.js b/packages/astro/test/middleware.test.js index 270666678e..432e6b9833 100644 --- a/packages/astro/test/middleware.test.js +++ b/packages/astro/test/middleware.test.js @@ -66,6 +66,11 @@ describe('Middleware in DEV mode', () => { let $ = cheerio.load(html); expect($('title').html()).to.equal('MiddlewareNoDataOrNextCalled'); }); + + it('should allow setting cookies', async () => { + let res = await fixture.fetch('/'); + expect(res.headers.get('set-cookie')).to.equal('foo=bar'); + }); }); describe('Middleware in PROD mode, SSG', () => {