{"version":3,"file":"cookie-builder.mjs","names":[],"sources":["../../../src/plugins/test-utils/cookie-builder.ts"],"sourcesContent":["import type { AuthContext } from \"@better-auth/core\";\nimport { makeSignature } from \"../../crypto\";\nimport type { TestCookie } from \"./types\";\n\n/**\n * Signs a cookie value using HMAC-SHA256\n */\nasync function signCookieValue(value: string, secret: string): Promise<string> {\n\tconst signature = await makeSignature(value, secret);\n\treturn `${value}.${signature}`;\n}\n\n/**\n * Creates a test cookie with proper signing and attributes\n */\nexport async function createTestCookie(\n\tctx: AuthContext,\n\tsessionToken: string,\n\tdomain?: string,\n): Promise<TestCookie[]> {\n\tconst secret = ctx.secret;\n\tconst signedToken = await signCookieValue(sessionToken, secret);\n\n\tconst cookieName = ctx.authCookies.sessionToken.name;\n\tconst cookieAttrs = ctx.authCookies.sessionToken.attributes;\n\n\tconst cookies: TestCookie[] = [\n\t\t{\n\t\t\tname: cookieName,\n\t\t\tvalue: signedToken,\n\t\t\tdomain: domain || getDomainFromBaseURL(ctx.baseURL),\n\t\t\tpath: cookieAttrs.path || \"/\",\n\t\t\thttpOnly: cookieAttrs.httpOnly ?? true,\n\t\t\tsecure: cookieAttrs.secure ?? false,\n\t\t\tsameSite: normalizeSameSite(cookieAttrs.sameSite),\n\t\t\texpires: cookieAttrs.maxAge\n\t\t\t\t? Math.floor(Date.now() / 1000) + cookieAttrs.maxAge\n\t\t\t\t: undefined,\n\t\t},\n\t];\n\n\treturn cookies;\n}\n\n/**\n * Creates a Headers object with the cookie header set\n */\nexport async function createCookieHeaders(\n\tctx: AuthContext,\n\tsessionToken: string,\n): Promise<Headers> {\n\tconst secret = ctx.secret;\n\tconst signedToken = await signCookieValue(sessionToken, secret);\n\tconst cookieName = ctx.authCookies.sessionToken.name;\n\n\tconst headers = new Headers();\n\theaders.set(\"cookie\", `${cookieName}=${signedToken}`);\n\n\treturn headers;\n}\n\nfunction getDomainFromBaseURL(baseURL: string): string {\n\ttry {\n\t\tconst url = new URL(baseURL);\n\t\treturn url.hostname;\n\t} catch {\n\t\treturn \"localhost\";\n\t}\n}\n\nfunction normalizeSameSite(\n\tsameSite: string | boolean | undefined,\n): \"Lax\" | \"Strict\" | \"None\" {\n\tif (typeof sameSite === \"string\") {\n\t\tconst lower = sameSite.toLowerCase();\n\t\tif (lower === \"strict\") return \"Strict\";\n\t\tif (lower === \"none\") return \"None\";\n\t}\n\treturn \"Lax\";\n}\n"],"mappings":";;;;;;AAOA,eAAe,gBAAgB,OAAe,QAAiC;AAE9E,QAAO,GAAG,MAAM,GADE,MAAM,cAAc,OAAO,OAAO;;;;;AAOrD,eAAsB,iBACrB,KACA,cACA,QACwB;CACxB,MAAM,SAAS,IAAI;CACnB,MAAM,cAAc,MAAM,gBAAgB,cAAc,OAAO;CAE/D,MAAM,aAAa,IAAI,YAAY,aAAa;CAChD,MAAM,cAAc,IAAI,YAAY,aAAa;AAiBjD,QAf8B,CAC7B;EACC,MAAM;EACN,OAAO;EACP,QAAQ,UAAU,qBAAqB,IAAI,QAAQ;EACnD,MAAM,YAAY,QAAQ;EAC1B,UAAU,YAAY,YAAY;EAClC,QAAQ,YAAY,UAAU;EAC9B,UAAU,kBAAkB,YAAY,SAAS;EACjD,SAAS,YAAY,SAClB,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK,GAAG,YAAY,SAC5C;EACH,CACD;;;;;AAQF,eAAsB,oBACrB,KACA,cACmB;CACnB,MAAM,SAAS,IAAI;CACnB,MAAM,cAAc,MAAM,gBAAgB,cAAc,OAAO;CAC/D,MAAM,aAAa,IAAI,YAAY,aAAa;CAEhD,MAAM,UAAU,IAAI,SAAS;AAC7B,SAAQ,IAAI,UAAU,GAAG,WAAW,GAAG,cAAc;AAErD,QAAO;;AAGR,SAAS,qBAAqB,SAAyB;AACtD,KAAI;AAEH,SADY,IAAI,IAAI,QAAQ,CACjB;SACJ;AACP,SAAO;;;AAIT,SAAS,kBACR,UAC4B;AAC5B,KAAI,OAAO,aAAa,UAAU;EACjC,MAAM,QAAQ,SAAS,aAAa;AACpC,MAAI,UAAU,SAAU,QAAO;AAC/B,MAAI,UAAU,OAAQ,QAAO;;AAE9B,QAAO"}