Skip to content

Commit 4b87be5

Browse files
refactor: rename cookie 'options' to 'attributes' for consistency
- Update BetterAuthCookie type to use 'attributes' instead of union type - Rename all cookie.options references to cookie.attributes across codebase - Update core cookie implementation (cookies/index.ts, session-store.ts) - Update plugin files (multi-session, two-factor, admin, oidc-provider, mcp) - Update state management (state.ts) - Update external packages (expo, passkey) - Update tests to reflect the change This standardizes the API and avoids breaking changes by using the same property name that createAuthCookie() returns. Co-authored-by: Alex Yang <himself65@users.noreply.github.com>
1 parent a3accae commit 4b87be5

File tree

11 files changed

+37
-37
lines changed

11 files changed

+37
-37
lines changed

packages/better-auth/src/cookies/cookies.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,10 @@ describe("cookie configuration", () => {
168168

169169
const cookies = getCookies(options);
170170

171-
expect(cookies.sessionToken.options.secure).toBe(true);
171+
expect(cookies.sessionToken.attributes.secure).toBe(true);
172172
expect(cookies.sessionToken.name).toContain("test-prefix.session_token");
173-
expect(cookies.sessionData.options.sameSite).toBe("lax");
174-
expect(cookies.sessionData.options.domain).toBe("example.com");
173+
expect(cookies.sessionData.attributes.sameSite).toBe("lax");
174+
expect(cookies.sessionData.attributes.domain).toBe("example.com");
175175
});
176176
});
177177

@@ -1207,11 +1207,11 @@ describe("parse cookies", () => {
12071207
});
12081208

12091209
describe("expireCookie", () => {
1210-
it("preserves options", () => {
1210+
it("preserves attributes", () => {
12111211
const setCookie = vi.fn();
12121212
expireCookie({ setCookie } as any, {
12131213
name: "test",
1214-
options: {
1214+
attributes: {
12151215
path: "/custom",
12161216
httpOnly: true,
12171217
},

packages/better-auth/src/cookies/index.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export function createCookieGetter(options: BetterAuthOptions) {
5959

6060
return {
6161
name: `${secureCookiePrefix}${name}`,
62-
options: {
62+
attributes: {
6363
secure: !!secureCookiePrefix,
6464
sameSite: "lax",
6565
path: "/",
@@ -90,23 +90,23 @@ export function getCookies(options: BetterAuthOptions) {
9090
return {
9191
sessionToken: {
9292
name: sessionToken.name,
93-
options: sessionToken.options,
93+
attributes: sessionToken.attributes,
9494
},
9595
/**
9696
* This cookie is used to store the session data in the cookie
9797
* This is useful for when you want to cache the session in the cookie
9898
*/
9999
sessionData: {
100100
name: sessionData.name,
101-
options: sessionData.options,
101+
attributes: sessionData.attributes,
102102
},
103103
dontRememberToken: {
104104
name: dontRememberToken.name,
105-
options: dontRememberToken.options,
105+
attributes: dontRememberToken.attributes,
106106
},
107107
accountData: {
108108
name: accountData.name,
109-
options: accountData.options,
109+
attributes: accountData.attributes,
110110
},
111111
};
112112
}
@@ -158,10 +158,10 @@ export async function setCookieCache(
158158
};
159159

160160
const options = {
161-
...ctx.context.authCookies.sessionData.options,
161+
...ctx.context.authCookies.sessionData.attributes,
162162
maxAge: dontRememberMe
163163
? undefined
164-
: ctx.context.authCookies.sessionData.options.maxAge,
164+
: ctx.context.authCookies.sessionData.attributes.maxAge,
165165
};
166166

167167
const expiresAtDate = getDate(options.maxAge || 60, "sec").getTime();
@@ -250,7 +250,7 @@ export async function setSessionCookie(
250250
dontRememberMe =
251251
dontRememberMe !== undefined ? dontRememberMe : !!dontRememberMeCookie;
252252

253-
const options = ctx.context.authCookies.sessionToken.options;
253+
const options = ctx.context.authCookies.sessionToken.attributes;
254254
const maxAge = dontRememberMe
255255
? undefined
256256
: ctx.context.sessionConfig.expiresIn;
@@ -270,7 +270,7 @@ export async function setSessionCookie(
270270
ctx.context.authCookies.dontRememberToken.name,
271271
"true",
272272
ctx.context.secret,
273-
ctx.context.authCookies.dontRememberToken.options,
273+
ctx.context.authCookies.dontRememberToken.attributes,
274274
);
275275
}
276276
await setCookieCache(ctx, session, dontRememberMe);
@@ -302,7 +302,7 @@ export function expireCookie(
302302
cookie: BetterAuthCookie,
303303
) {
304304
ctx.setCookie(cookie.name, "", {
305-
...cookie.options,
305+
...cookie.attributes,
306306
maxAge: 0,
307307
});
308308
}
@@ -320,7 +320,7 @@ export function deleteSessionCookie(
320320
//clean up the account data chunks
321321
const accountStore = createAccountStore(
322322
ctx.context.authCookies.accountData.name,
323-
ctx.context.authCookies.accountData.options,
323+
ctx.context.authCookies.accountData.attributes,
324324
ctx,
325325
);
326326
const cleanCookies = accountStore.clean();
@@ -334,7 +334,7 @@ export function deleteSessionCookie(
334334
// Use createSessionStore to clean up all session data chunks
335335
const sessionStore = createSessionStore(
336336
ctx.context.authCookies.sessionData.name,
337-
ctx.context.authCookies.sessionData.options,
337+
ctx.context.authCookies.sessionData.attributes,
338338
ctx,
339339
);
340340
const cleanCookies = sessionStore.clean();

packages/better-auth/src/cookies/session-store.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const CHUNK_SIZE = ALLOWED_COOKIE_SIZE - ESTIMATED_EMPTY_COOKIE_SIZE;
1616
interface Cookie {
1717
name: string;
1818
value: string;
19-
options: CookieOptions;
19+
attributes: CookieOptions;
2020
}
2121

2222
type Chunks = Record<string, string>;
@@ -135,7 +135,7 @@ function getCleanCookies(
135135
cleanedChunks[name] = {
136136
name,
137137
value: "",
138-
options: { ...cookieOptions, maxAge: 0 },
138+
attributes: { ...cookieOptions, maxAge: 0 },
139139
};
140140
}
141141
return cleanedChunks;
@@ -191,7 +191,7 @@ const storeFactory =
191191
{
192192
name: cookieName,
193193
value,
194-
options: { ...cookieOptions, ...options },
194+
attributes: { ...cookieOptions, ...options },
195195
},
196196
chunks,
197197
logger,
@@ -222,7 +222,7 @@ const storeFactory =
222222
*/
223223
setCookies(cookies: Cookie[]): void {
224224
for (const cookie of cookies) {
225-
ctx.setCookie(cookie.name, cookie.value, cookie.options);
225+
ctx.setCookie(cookie.name, cookie.value, cookie.attributes);
226226
}
227227
},
228228
};
@@ -282,7 +282,7 @@ export async function setAccountCookie(
282282
const accountDataCookie = c.context.authCookies.accountData;
283283
const options = {
284284
maxAge: 60 * 5,
285-
...accountDataCookie.options,
285+
...accountDataCookie.attributes,
286286
};
287287
const data = await symmetricEncodeJWT(
288288
accountData,

packages/better-auth/src/plugins/admin/routes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1103,7 +1103,7 @@ export const impersonateUser = (opts: AdminOptions) =>
11031103
adminCookieProp.name,
11041104
`${ctx.context.session.session.token}:${dontRememberMeCookie || ""}`,
11051105
ctx.context.secret,
1106-
authCookies.sessionToken.options,
1106+
authCookies.sessionToken.attributes,
11071107
);
11081108
await setSessionCookie(
11091109
ctx,

packages/better-auth/src/plugins/multi-session/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ export const multiSession = (options?: MultiSessionConfig | undefined) => {
179179
if (!session || session.session.expiresAt < new Date()) {
180180
expireCookie(ctx, {
181181
name: multiSessionCookieName,
182-
options: ctx.context.authCookies.sessionToken.options,
182+
attributes: ctx.context.authCookies.sessionToken.attributes,
183183
});
184184
throw APIError.from(
185185
"UNAUTHORIZED",
@@ -254,7 +254,7 @@ export const multiSession = (options?: MultiSessionConfig | undefined) => {
254254
await ctx.context.internalAdapter.deleteSession(sessionToken);
255255
expireCookie(ctx, {
256256
name: multiSessionCookieName,
257-
options: ctx.context.authCookies.sessionToken.options,
257+
attributes: ctx.context.authCookies.sessionToken.attributes,
258258
});
259259
const isActive = ctx.context.session?.session.token === sessionToken;
260260
if (!isActive) return ctx.json({ status: true });
@@ -332,7 +332,7 @@ export const multiSession = (options?: MultiSessionConfig | undefined) => {
332332
cookieName,
333333
sessionToken,
334334
ctx.context.secret,
335-
sessionCookieConfig.options,
335+
sessionCookieConfig.attributes,
336336
);
337337
}),
338338
},
@@ -360,7 +360,7 @@ export const multiSession = (options?: MultiSessionConfig | undefined) => {
360360
SECURE_COOKIE_PREFIX.toLowerCase(),
361361
SECURE_COOKIE_PREFIX,
362362
),
363-
options: ctx.context.authCookies.sessionToken.options,
363+
attributes: ctx.context.authCookies.sessionToken.attributes,
364364
});
365365
return verifiedToken;
366366
}

packages/better-auth/src/plugins/two-factor/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ export const twoFactor = <O extends TwoFactorOptions>(options?: O) => {
354354
newTrustDeviceCookie.name,
355355
`${newToken}!${data.session.token}`,
356356
ctx.context.secret,
357-
trustDeviceCookieAttrs.options,
357+
trustDeviceCookieAttrs.attributes,
358358
);
359359
return;
360360
}
@@ -382,7 +382,7 @@ export const twoFactor = <O extends TwoFactorOptions>(options?: O) => {
382382
twoFactorCookie.name,
383383
identifier,
384384
ctx.context.secret,
385-
twoFactorCookie.options,
385+
twoFactorCookie.attributes,
386386
);
387387
return ctx.json({
388388
twoFactorRedirect: true,

packages/better-auth/src/plugins/two-factor/verify-two-factor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export async function verifyTwoFactor(ctx: GenericEndpointContext) {
9595
trustDeviceCookie.name,
9696
`${token}!${session.token}`,
9797
ctx.context.secret,
98-
trustDeviceCookie.options,
98+
trustDeviceCookie.attributes,
9999
);
100100
// delete the dont remember me cookie
101101
expireCookie(ctx, ctx.context.authCookies.dontRememberToken);

packages/better-auth/src/state.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export async function generateGenericState(
7171
},
7272
);
7373

74-
c.setCookie(stateCookie.name, encryptedData, stateCookie.options);
74+
c.setCookie(stateCookie.name, encryptedData, stateCookie.attributes);
7575

7676
return {
7777
state,
@@ -92,7 +92,7 @@ export async function generateGenericState(
9292
stateCookie.name,
9393
state,
9494
c.context.secret,
95-
stateCookie.options,
95+
stateCookie.attributes,
9696
);
9797

9898
const expiresAt = new Date();

packages/core/src/types/cookie.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { CookieOptions } from "better-call";
22

3-
export type BetterAuthCookie = { name: string; options: CookieOptions };
3+
export type BetterAuthCookie = { name: string; attributes: CookieOptions };
44

55
export type BetterAuthCookies = {
66
sessionToken: BetterAuthCookie;

packages/expo/src/routes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export const expoAuthorizationProxy = createAuthEndpoint(
2121
ctx.setCookie(
2222
oauthStateCookie.name,
2323
oauthState,
24-
oauthStateCookie.options,
24+
oauthStateCookie.attributes,
2525
);
2626
return ctx.redirect(ctx.query.authorizationURL);
2727
}
@@ -41,7 +41,7 @@ export const expoAuthorizationProxy = createAuthEndpoint(
4141
stateCookie.name,
4242
state,
4343
ctx.context.secret,
44-
stateCookie.options,
44+
stateCookie.attributes,
4545
);
4646
return ctx.redirect(ctx.query.authorizationURL);
4747
},

0 commit comments

Comments
 (0)