From b27221b3561478ae98ed5955fde51dfcf59d4a21 Mon Sep 17 00:00:00 2001 From: Alec Larson <1925840+aleclarson@users.noreply.github.com> Date: Thu, 31 Jul 2025 20:21:34 -0400 Subject: [PATCH] feat: return false from `generateId` callback to imply database-generated ID (#3723) * feat: return false from generateId to imply database-generated ID * chore: add changeset * chore: update changeset --------- Co-authored-by: Bereket Engida <86073083+Bekacru@users.noreply.github.com> --- .changeset/funny-rules-rest.md | 5 +++++ packages/better-auth/src/init.ts | 2 +- packages/better-auth/src/plugins/anonymous/index.ts | 3 ++- packages/better-auth/src/types/options.ts | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 .changeset/funny-rules-rest.md diff --git a/.changeset/funny-rules-rest.md b/.changeset/funny-rules-rest.md new file mode 100644 index 0000000000..d6afbf4c29 --- /dev/null +++ b/.changeset/funny-rules-rest.md @@ -0,0 +1,5 @@ +--- +"better-auth": patch +--- + +feat: allow returning false from `generateId` callback to imply database-generated ID diff --git a/packages/better-auth/src/init.ts b/packages/better-auth/src/init.ts index 8d8c12fe74..ee55358752 100644 --- a/packages/better-auth/src/init.ts +++ b/packages/better-auth/src/init.ts @@ -205,7 +205,7 @@ export type AuthContext = { generateId: (options: { model: LiteralUnion; size?: number; - }) => string; + }) => string | false; secondaryStorage: SecondaryStorage | undefined; password: { hash: (password: string) => Promise; diff --git a/packages/better-auth/src/plugins/anonymous/index.ts b/packages/better-auth/src/plugins/anonymous/index.ts index ec92078bf7..c0d2e2ba62 100644 --- a/packages/better-auth/src/plugins/anonymous/index.ts +++ b/packages/better-auth/src/plugins/anonymous/index.ts @@ -16,6 +16,7 @@ import { parseSetCookieHeader, setSessionCookie } from "../../cookies"; import { getOrigin } from "../../utils/url"; import { mergeSchema } from "../../db/schema"; import type { EndpointContext } from "better-call"; +import { generateId } from "../../utils/id"; export interface UserWithAnonymous extends User { isAnonymous: boolean; @@ -119,7 +120,7 @@ export const anonymous = (options?: AnonymousOptions) => { async (ctx) => { const { emailDomainName = getOrigin(ctx.context.baseURL) } = options || {}; - const id = ctx.context.generateId({ model: "user" }); + const id = generateId(); const email = `temp-${id}@${emailDomainName}`; const name = (await options?.generateName?.(ctx)) || "Anonymous"; const newUser = await ctx.context.internalAdapter.createUser( diff --git a/packages/better-auth/src/types/options.ts b/packages/better-auth/src/types/options.ts index f0620a09ed..6e9ca536db 100644 --- a/packages/better-auth/src/types/options.ts +++ b/packages/better-auth/src/types/options.ts @@ -762,7 +762,7 @@ export type BetterAuthOptions = { | ((options: { model: LiteralUnion; size?: number; - }) => string) + }) => string | false) | false; }; /**