diff --git a/docs/content/docs/plugins/admin.mdx b/docs/content/docs/plugins/admin.mdx
index e9a9e339e7..262c7bbe80 100644
--- a/docs/content/docs/plugins/admin.mdx
+++ b/docs/content/docs/plugins/admin.mdx
@@ -570,3 +570,14 @@ admin({
defaultBanExpiresIn: 60 * 60 * 24, // 1 day
});
```
+
+### bannedUserMessage
+
+The message to show when a banned user tries to sign in. Defaults to "You have been banned from this application. Please contact support if you believe this is an error."
+
+```ts title="auth.ts"
+admin({
+ bannedUserMessage: "Custom banned user message",
+});
+```
+
diff --git a/packages/better-auth/src/client/solid/index.ts b/packages/better-auth/src/client/solid/index.ts
index d8f83b4a03..0ebfc9e6f9 100644
--- a/packages/better-auth/src/client/solid/index.ts
+++ b/packages/better-auth/src/client/solid/index.ts
@@ -93,3 +93,5 @@ export function createAuthClient(
>;
};
}
+
+export type * from "@better-fetch/fetch";
diff --git a/packages/better-auth/src/client/svelte/index.ts b/packages/better-auth/src/client/svelte/index.ts
index 8f717ff50a..c334385936 100644
--- a/packages/better-auth/src/client/svelte/index.ts
+++ b/packages/better-auth/src/client/svelte/index.ts
@@ -92,3 +92,5 @@ export function createAuthClient (
>;
};
}
+
+export type * from "@better-fetch/fetch";
diff --git a/packages/better-auth/src/client/vue/index.ts b/packages/better-auth/src/client/vue/index.ts
index cb6b11a7b6..1ae2d68022 100644
--- a/packages/better-auth/src/client/vue/index.ts
+++ b/packages/better-auth/src/client/vue/index.ts
@@ -140,3 +140,5 @@ export function createAuthClient (
>;
};
}
+
+export type * from "@better-fetch/fetch";
diff --git a/packages/better-auth/src/plugins/admin/admin.test.ts b/packages/better-auth/src/plugins/admin/admin.test.ts
index e9aab1d9e2..24ea0076f7 100644
--- a/packages/better-auth/src/plugins/admin/admin.test.ts
+++ b/packages/better-auth/src/plugins/admin/admin.test.ts
@@ -9,7 +9,11 @@ describe("Admin plugin", async () => {
const { signInWithTestUser, signInWithUser, cookieSetter, customFetchImpl } =
await getTestInstance(
{
- plugins: [admin()],
+ plugins: [
+ admin({
+ bannedUserMessage: "Custom banned user message",
+ }),
+ ],
databaseHooks: {
user: {
create: {
@@ -260,7 +264,16 @@ describe("Admin plugin", async () => {
email: newUser?.email || "",
password: "test",
});
- expect(res.error?.status).toBe(401);
+ expect(res.error?.code).toBe("BANNED_USER");
+ expect(res.error?.status).toBe(403);
+ });
+
+ it("should change banned user message", async () => {
+ const res = await client.signIn.email({
+ email: newUser?.email || "",
+ password: "test",
+ });
+ expect(res.error?.message).toBe("Custom banned user message");
});
it("should allow banned user to sign in if ban expired", async () => {
diff --git a/packages/better-auth/src/plugins/admin/admin.ts b/packages/better-auth/src/plugins/admin/admin.ts
index 11c3b945f9..c95777499b 100644
--- a/packages/better-auth/src/plugins/admin/admin.ts
+++ b/packages/better-auth/src/plugins/admin/admin.ts
@@ -88,12 +88,20 @@ export interface AdminOptions {
* If this is set, the `adminRole` option is ignored
*/
adminUserIds?: string[];
+ /**
+ * Message to show when a user is banned
+ *
+ * By default, the message is "You have been banned from this application"
+ */
+ bannedUserMessage?: string;
}
export const admin = (options?: O) => {
const opts = {
defaultRole: "user",
adminRoles: ["admin"],
+ bannedUserMessage:
+ "You have been banned from this application. Please contact support if you believe this is an error.",
...options,
};
type DefaultStatements = typeof defaultStatements;
@@ -153,7 +161,11 @@ export const admin = (options?: O) => {
});
return;
}
- return false;
+
+ throw new APIError("FORBIDDEN", {
+ message: opts.bannedUserMessage,
+ code: "BANNED_USER",
+ });
}
},
},
diff --git a/packages/better-auth/src/plugins/admin/error-codes.ts b/packages/better-auth/src/plugins/admin/error-codes.ts
index 6db68cf5e6..e835392bb2 100644
--- a/packages/better-auth/src/plugins/admin/error-codes.ts
+++ b/packages/better-auth/src/plugins/admin/error-codes.ts
@@ -16,4 +16,5 @@ export const ADMIN_ERROR_CODES = {
YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS: "You are not allowed to delete users",
YOU_ARE_NOT_ALLOWED_TO_SET_USERS_PASSWORD:
"You are not allowed to set users password",
+ BANNED_USER: "You have been banned from this application",
} as const;
diff --git a/packages/better-auth/src/test-utils/test-instance.ts b/packages/better-auth/src/test-utils/test-instance.ts
index a602b0556e..ad09d01a4c 100644
--- a/packages/better-auth/src/test-utils/test-instance.ts
+++ b/packages/better-auth/src/test-utils/test-instance.ts
@@ -218,8 +218,7 @@ export async function getTestInstance<
url: string | URL | Request,
init?: RequestInit,
) => {
- const req = new Request(url.toString(), init);
- return auth.handler(req);
+ return auth.handler(new Request(url, init));
};
function sessionSetter(headers: Headers) {