diff --git a/.changeset/wild-pianos-join.md b/.changeset/wild-pianos-join.md new file mode 100644 index 0000000000..202bbe8a67 --- /dev/null +++ b/.changeset/wild-pianos-join.md @@ -0,0 +1,5 @@ +--- +"better-auth": patch +--- + +fix(username): `isUsernameAvailable` should run validation diff --git a/packages/better-auth/src/plugins/username/index.ts b/packages/better-auth/src/plugins/username/index.ts index 3dfd0c5359..e7df89136d 100644 --- a/packages/better-auth/src/plugins/username/index.ts +++ b/packages/better-auth/src/plugins/username/index.ts @@ -268,6 +268,30 @@ export const username = (options?: UsernameOptions) => { message: ERROR_CODES.INVALID_USERNAME, }); } + const minUsernameLength = options?.minUsernameLength || 3; + const maxUsernameLength = options?.maxUsernameLength || 30; + if (username.length < minUsernameLength) { + throw new APIError("UNPROCESSABLE_ENTITY", { + message: ERROR_CODES.USERNAME_TOO_SHORT, + }); + } + + if (username.length > maxUsernameLength) { + throw new APIError("UNPROCESSABLE_ENTITY", { + message: ERROR_CODES.USERNAME_TOO_LONG, + }); + } + + const validator = + options?.usernameValidator || defaultUsernameValidator; + + const valid = await validator(username); + if (!valid) { + throw new APIError("UNPROCESSABLE_ENTITY", { + message: ERROR_CODES.INVALID_USERNAME, + }); + } + const user = await ctx.context.adapter.findOne({ model: "user", where: [