diff --git a/.gitignore b/.gitignore index dec0cc8..ba87a3c 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ yarn-debug.log* yarn-error.log* package.tgz apps/www/src/pages/docs/packages/* + +.idea diff --git a/packages/adapter/src/lambda/__tests__/helpers.test.ts b/packages/adapter/src/lambda/__tests__/helpers.test.ts index b14d7b7..c4d757c 100644 --- a/packages/adapter/src/lambda/__tests__/helpers.test.ts +++ b/packages/adapter/src/lambda/__tests__/helpers.test.ts @@ -2,7 +2,7 @@ import type { App } from "astro/app"; import { beforeEach, describe, expect, test, vi } from "vitest"; import { faker } from "@faker-js/faker"; -import { createLambdaFunctionResponse } from "../helpers.js"; +import { createLambdaFunctionResponse, createLambdaEdgeFunctionResponse } from "../helpers.js"; const knownBinaryMediaTypes = new Set(["image/png", "image/jpeg"]); @@ -45,4 +45,63 @@ describe("helpers", () => { }); }); }); + + describe("createLambdaEdgeFunctionResponse", () => { + let response: Response, + app: App, + fnResponse: Awaited>, + body: string, + headers: Record; + + beforeEach(async () => { + body = faker.datatype.string(); + headers = { + "content-type": "text/plain", + }; + + response = new Response(body, { + headers, + status: 200, + }); + + app = { + setCookieHeaders: vi.fn(() => [ + "newCookie=newValue", + "deleteCookie=deleted; Expires=Thu, 01 Jan 1970 00:00:00 GMT" + ]), + } as unknown as App; + + fnResponse = await createLambdaEdgeFunctionResponse(app, response, knownBinaryMediaTypes); + }); + + test("creates function response", () => { + expect(app.setCookieHeaders).toHaveBeenCalledTimes(1); + expect(app.setCookieHeaders).toHaveBeenCalledWith(response); + + expect(fnResponse).toStrictEqual({ + body, + bodyEncoding: "text", + headers: { + "content-type": [ + { + key: "content-type", + value: "text/plain", + }, + ], + "set-cookie": [ + { + key: "set-cookie", + value: "newCookie=newValue", + }, + { + key: "set-cookie", + value: "deleteCookie=deleted; Expires=Thu, 01 Jan 1970 00:00:00 GMT", + }, + ], + }, + status: "200", + statusDescription: "", + }); + }); + }); }); diff --git a/packages/adapter/src/lambda/helpers.ts b/packages/adapter/src/lambda/helpers.ts index 069b556..440f615 100644 --- a/packages/adapter/src/lambda/helpers.ts +++ b/packages/adapter/src/lambda/helpers.ts @@ -50,23 +50,31 @@ export const createLambdaEdgeFunctionResponse = async ( response: Response, knownBinaryMediaTypes: Set, ): Promise => { - app.setCookieHeaders(response); + const cookies = [...app.setCookieHeaders(response)]; const responseHeadersObj = Object.fromEntries(response.headers.entries()); - const headers: CloudFrontHeaders = Object.fromEntries( - Object.entries(responseHeadersObj) - .filter(([key]) => !DISALLOWED_EDGE_HEADERS.some((reg) => reg.test(key.toLowerCase()))) - .map(([key, value]) => [ - key.toLowerCase(), - [ - { - key, - value, - }, - ], - ]), - ); + const headers: CloudFrontHeaders = { + ...Object.fromEntries( + Object.entries(responseHeadersObj) + .filter(([key]) => !DISALLOWED_EDGE_HEADERS.some((reg) => reg.test(key.toLowerCase()))) + .map(([key, value]) => [ + key.toLowerCase(), + [ + { + key, + value, + }, + ], + ]), + ), + ...(cookies.length > 0 && { + 'set-cookie': cookies.map((cookie) => ({ + key: 'set-cookie', + value: cookie, + })), + }), + } const responseContentType = parseContentType(response.headers.get("content-type")); const bodyEncoding = knownBinaryMediaTypes.has(responseContentType) ? "base64" : "text";