chore: sync main to next

Merge branch 'main' into next
This commit is contained in:
Gustavo Valverde
2026-08-17 15:29:19 -04:00
34 changed files with 476 additions and 74 deletions
+1 -1
View File
@@ -61,7 +61,7 @@ To generate and apply the migration, run the following commands:
## Joins
Database joins is useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Database joins are useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Endpoints like `/get-session`, `/get-full-organization` and many others benefit greatly from this feature,
seeing upwards of 2x to 3x performance improvements depending on database latency.
+1 -1
View File
@@ -41,7 +41,7 @@ For MongoDB, we don't need to generate or migrate the schema.
## Joins
Database joins is useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Database joins are useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Endpoints like `/get-session`, `/get-full-organization` and many others benefit greatly from this feature,
seeing upwards of 2x to 3x performance improvements depending on database latency.
+1 -1
View File
@@ -105,7 +105,7 @@ your database schema based on your Better Auth configuration and plugins.
## Joins
Database joins is useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Database joins are useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Endpoints like `/get-session`, `/get-full-organization` and many others benefit greatly from this feature,
seeing upwards of 2x to 3x performance improvements depending on database latency.
+1 -1
View File
@@ -83,7 +83,7 @@ your database schema based on your Better Auth configuration and plugins.
## Joins
Database joins is useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Database joins are useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Endpoints like `/get-session`, `/get-full-organization` and many others benefit greatly from this feature,
seeing upwards of 2x to 3x performance improvements depending on database latency.
+1 -1
View File
@@ -69,7 +69,7 @@ your database schema based on your Better Auth configuration and plugins.
## Joins
Database joins is useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Database joins are useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Endpoints like `/get-session`, `/get-full-organization` and many others benefit greatly from this feature,
seeing upwards of 2x to 3x performance improvements depending on database latency.
+1 -1
View File
@@ -69,7 +69,7 @@ npx auth@latest generate
## Joins
Database joins is useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Database joins are useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Endpoints like `/get-session`, `/get-full-organization` and many others benefit greatly from this feature,
seeing upwards of 2x to 3x performance improvements depending on database latency.
+1 -1
View File
@@ -110,7 +110,7 @@ your database schema based on your Better Auth configuration and plugins.
## Joins
Database joins is useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Database joins are useful when Better-Auth needs to fetch related data from multiple tables in a single query.
Endpoints like `/get-session`, `/get-full-organization` and many others benefit greatly from this feature,
seeing upwards of 2x to 3x performance improvements depending on database latency.
+16
View File
@@ -58,6 +58,22 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- better-auth@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies [[`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3)]:
- better-auth@1.6.29
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+28
View File
@@ -416,6 +416,34 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- @better-auth/drizzle-adapter@1.6.30
- @better-auth/kysely-adapter@1.6.30
- @better-auth/memory-adapter@1.6.30
- @better-auth/mongo-adapter@1.6.30
- @better-auth/prisma-adapter@1.6.30
- @better-auth/telemetry@1.6.30
## 1.6.29
### Patch Changes
- [#10805](https://github.com/better-auth/better-auth/pull/10805) [`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3) Thanks [@Emmaccen](https://github.com/Emmaccen)! - Speed up batch session revocation when secondary storage is enabled by deleting sessions in parallel.
- Updated dependencies []:
- @better-auth/core@1.6.29
- @better-auth/drizzle-adapter@1.6.29
- @better-auth/kysely-adapter@1.6.29
- @better-auth/memory-adapter@1.6.29
- @better-auth/mongo-adapter@1.6.29
- @better-auth/prisma-adapter@1.6.29
- @better-auth/telemetry@1.6.29
## 1.6.28
### Patch Changes
@@ -973,12 +973,9 @@ export const createInternalAdapter = (
},
deleteSessions: async (sessionTokens: string[]) => {
if (secondaryStorage) {
for (const sessionToken of sessionTokens) {
const session = await secondaryStorage.get(sessionToken);
if (session) {
await secondaryStorage.delete(sessionToken);
}
}
await Promise.all(
sessionTokens.map((token) => secondaryStorage.delete(token)),
);
if (!options.session?.storeSessionInDatabase) {
return;
+18
View File
@@ -133,6 +133,24 @@
- [#9547](https://github.com/better-auth/better-auth/pull/9547) [`15bb169`](https://github.com/better-auth/better-auth/commit/15bb1690b274b9f1e2a58c5db039bd240dc5e99b) Thanks [@GautamBytes](https://github.com/GautamBytes)! - Add a `create-admin` CLI command for creating an initial admin user through the configured Better Auth instance.
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- better-auth@1.6.30
- @better-auth/telemetry@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies [[`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3)]:
- better-auth@1.6.29
- @better-auth/core@1.6.29
- @better-auth/telemetry@1.6.29
## 1.6.28
### Patch Changes
+8
View File
@@ -167,6 +167,14 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- [#10833](https://github.com/better-auth/better-auth/pull/10833) [`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99) Thanks [@bytaesu](https://github.com/bytaesu)! - Prevent concurrent cold-start requests from intermittently losing authentication or transaction context.
## 1.6.29
## 1.6.28
## 1.6.27
@@ -0,0 +1,48 @@
import { describe, expect, it, onTestFinished, vi } from "vitest";
import type { AuthEndpointContext } from "./endpoint-context";
import { __getBetterAuthGlobal } from "./global";
describe("runWithEndpointContext", () => {
/**
* @see https://github.com/better-auth/better-auth/issues/10832
*/
it("preserves each endpoint context across concurrent first calls", async () => {
vi.resetModules();
const globalContext = __getBetterAuthGlobal().context;
const previousStorageDescriptor = Object.getOwnPropertyDescriptor(
globalContext,
"endpointContextAsyncStorage",
);
onTestFinished(() => {
if (previousStorageDescriptor) {
Object.defineProperty(
globalContext,
"endpointContextAsyncStorage",
previousStorageDescriptor,
);
} else {
Reflect.deleteProperty(globalContext, "endpointContextAsyncStorage");
}
});
Reflect.deleteProperty(globalContext, "endpointContextAsyncStorage");
const mod = await import("./endpoint-context");
const contexts = Array.from(
{ length: 32 },
() => ({}) as AuthEndpointContext,
);
const currentContexts = await Promise.all(
contexts.map((context) =>
mod.runWithEndpointContext(context, async () => {
await Promise.resolve();
return mod.getCurrentAuthContext();
}),
),
);
const matchingContextCount = currentContexts.filter(
(currentContext, index) => currentContext === contexts[index],
).length;
expect(matchingContextCount).toBe(contexts.length);
});
});
@@ -12,11 +12,13 @@ export type AuthEndpointContext = Partial<
const ensureAsyncStorage = async () => {
const betterAuthGlobal = __getBetterAuthGlobal();
if (!betterAuthGlobal.context.endpointContextAsyncStorage) {
const AsyncLocalStorage = await getAsyncLocalStorage();
betterAuthGlobal.context.endpointContextAsyncStorage =
new AsyncLocalStorage<AuthEndpointContext>();
const existing = betterAuthGlobal.context.endpointContextAsyncStorage;
if (existing) {
return existing as AsyncLocalStorage<AuthEndpointContext>;
}
const AsyncLocalStorage = await getAsyncLocalStorage();
betterAuthGlobal.context.endpointContextAsyncStorage ??=
new AsyncLocalStorage<AuthEndpointContext>();
return betterAuthGlobal.context
.endpointContextAsyncStorage as AsyncLocalStorage<AuthEndpointContext>;
};
+38 -29
View File
@@ -1,4 +1,5 @@
import { describe, expect, it, vi } from "vitest";
import { describe, expect, it, onTestFinished, vi } from "vitest";
import { __getBetterAuthGlobal } from "./global";
import type { RequestStateWeakMap } from "./request-state";
import {
defineRequestState,
@@ -92,40 +93,48 @@ describe("request-state", () => {
});
});
describe("AsyncLocalStorage init race", () => {
it("shares one AsyncLocalStorage across concurrent first-callers", async () => {
// Force a cold start: reset the module (clears the memoized init) and
// clear the global singleton, so the concurrent burst below all races
// through ensureAsyncStorage()'s lazy initialization.
describe("concurrent first calls", () => {
/**
* @see https://github.com/better-auth/better-auth/issues/10832
*/
it("preserves each request state", async () => {
vi.resetModules();
const betterAuthGlobalSymbol = Symbol.for("better-auth:global");
const betterAuthGlobal = (globalThis as any)[betterAuthGlobalSymbol];
if (betterAuthGlobal?.context) {
betterAuthGlobal.context.requestStateAsyncStorage = undefined;
}
const globalContext = __getBetterAuthGlobal().context;
const previousStorageDescriptor = Object.getOwnPropertyDescriptor(
globalContext,
"requestStateAsyncStorage",
);
onTestFinished(() => {
if (previousStorageDescriptor) {
Object.defineProperty(
globalContext,
"requestStateAsyncStorage",
previousStorageDescriptor,
);
} else {
Reflect.deleteProperty(globalContext, "requestStateAsyncStorage");
}
});
Reflect.deleteProperty(globalContext, "requestStateAsyncStorage");
const mod = await import("./request-state");
const N = 32;
const outcomes = await Promise.all(
Array.from({ length: N }, () =>
mod
.runWithRequestState(new WeakMap(), async () => {
// Yield so every caller interleaves through the cold init
// window before any of them reads its state back.
await Promise.resolve();
await new Promise((resolve) => setTimeout(resolve, 0));
// Throws "No request state found" if this caller's run()
// executed on a different instance than the one resolved here.
await mod.getCurrentRequestState();
})
.then(
() => true,
() => false,
),
const stores: RequestStateWeakMap[] = Array.from(
{ length: 32 },
() => new WeakMap<object, unknown>(),
);
const currentStores = await Promise.all(
stores.map((store) =>
mod.runWithRequestState(store, async () => {
await Promise.resolve();
return mod.getCurrentRequestState();
}),
),
);
expect(outcomes.every(Boolean)).toBe(true);
const matchingStoreCount = currentStores.filter(
(currentStore, index) => currentStore === stores[index],
).length;
expect(matchingStoreCount).toBe(stores.length);
});
});
});
+5 -23
View File
@@ -4,35 +4,17 @@ import { __getBetterAuthGlobal } from "./global";
export type RequestStateWeakMap = WeakMap<object, any>;
// Memoizes the in-flight AsyncLocalStorage initialization so concurrent
// first-callers share a single instance instead of each constructing one.
let asyncStorageInit: Promise<AsyncLocalStorage<RequestStateWeakMap>> | null =
null;
const ensureAsyncStorage = async () => {
const betterAuthGlobal = __getBetterAuthGlobal();
const existing = betterAuthGlobal.context.requestStateAsyncStorage;
if (existing) {
return existing as AsyncLocalStorage<RequestStateWeakMap>;
}
// Without memoizing the init, several concurrent callers can each pass the
// check above, each `await getAsyncLocalStorage()`, and each assign a fresh
// instance — last write wins. `runWithRequestState().run()` then executes on
// one instance while a nested `getCurrentRequestState()` reads the
// overwritten one, throwing "No request state found". This shows up
// intermittently on serverless cold start (e.g. Cloudflare Workers), where
// the first requests hit before the lazy `node:async_hooks` import settles.
// The idempotent `??=` keeps the global singleton stable even if multiple
// BetterAuth copies (Dual Module Hazard) race here.
if (!asyncStorageInit) {
asyncStorageInit = getAsyncLocalStorage().then((AsyncLocalStorage) => {
betterAuthGlobal.context.requestStateAsyncStorage ??=
new AsyncLocalStorage<RequestStateWeakMap>();
return betterAuthGlobal.context
.requestStateAsyncStorage as AsyncLocalStorage<RequestStateWeakMap>;
});
}
return asyncStorageInit;
const AsyncLocalStorage = await getAsyncLocalStorage();
betterAuthGlobal.context.requestStateAsyncStorage ??=
new AsyncLocalStorage<RequestStateWeakMap>();
return betterAuthGlobal.context
.requestStateAsyncStorage as AsyncLocalStorage<RequestStateWeakMap>;
};
export async function getRequestStateAsyncLocalStorage() {
+51 -1
View File
@@ -1,5 +1,6 @@
import { describe, expect, it, vi } from "vitest";
import { describe, expect, it, onTestFinished, vi } from "vitest";
import type { DBAdapter, DBTransactionAdapter } from "../db/adapter";
import { __getBetterAuthGlobal } from "./global";
import {
getCurrentAdapter,
queueAfterTransactionHook,
@@ -187,4 +188,53 @@ describe("runWithTransaction", () => {
);
expect(hook).toHaveBeenCalledOnce();
});
/**
* @see https://github.com/better-auth/better-auth/issues/10832
*/
it("preserves each transaction adapter across concurrent first calls", async () => {
vi.resetModules();
const globalContext = __getBetterAuthGlobal().context;
const previousStorageDescriptor = Object.getOwnPropertyDescriptor(
globalContext,
"adapterAsyncStorage",
);
onTestFinished(() => {
if (previousStorageDescriptor) {
Object.defineProperty(
globalContext,
"adapterAsyncStorage",
previousStorageDescriptor,
);
} else {
Reflect.deleteProperty(globalContext, "adapterAsyncStorage");
}
});
Reflect.deleteProperty(globalContext, "adapterAsyncStorage");
const mod = await import("./transaction");
const harnesses = Array.from({ length: 32 }, () => {
const transactionAdapter = {} as DBTransactionAdapter;
const adapter = {
transaction: async <R>(
callback: (trx: DBTransactionAdapter) => Promise<R>,
) => callback(transactionAdapter),
} as DBAdapter;
return { adapter, transactionAdapter };
});
const currentAdapters = await Promise.all(
harnesses.map(({ adapter }) =>
mod.runWithTransaction(adapter, async () => {
await Promise.resolve();
return mod.getCurrentAdapter(adapter);
}),
),
);
const transactionAdapterCount = currentAdapters.filter(
(currentAdapter, index) =>
currentAdapter === harnesses[index]?.transactionAdapter,
).length;
expect(transactionAdapterCount).toBe(harnesses.length);
});
});
+6 -4
View File
@@ -1,4 +1,4 @@
import type { AsyncLocalStorage } from "node:async_hooks";
import type { AsyncLocalStorage } from "@better-auth/core/async_hooks";
import { getAsyncLocalStorage } from "@better-auth/core/async_hooks";
import type { DBAdapter, DBTransactionAdapter } from "../db/adapter";
import type { BetterAuthOptions } from "../types";
@@ -14,10 +14,12 @@ type HookContext = {
const ensureAsyncStorage = async () => {
const betterAuthGlobal = __getBetterAuthGlobal();
if (!betterAuthGlobal.context.adapterAsyncStorage) {
const AsyncLocalStorage = await getAsyncLocalStorage();
betterAuthGlobal.context.adapterAsyncStorage = new AsyncLocalStorage();
const existing = betterAuthGlobal.context.adapterAsyncStorage;
if (existing) {
return existing as AsyncLocalStorage<HookContext>;
}
const AsyncLocalStorage = await getAsyncLocalStorage();
betterAuthGlobal.context.adapterAsyncStorage ??= new AsyncLocalStorage();
return betterAuthGlobal.context
.adapterAsyncStorage as AsyncLocalStorage<HookContext>;
};
+14
View File
@@ -81,6 +81,20 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies []:
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+16
View File
@@ -74,6 +74,22 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- better-auth@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies [[`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3)]:
- better-auth@1.6.29
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+16
View File
@@ -70,6 +70,22 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- better-auth@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies [[`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3)]:
- better-auth@1.6.29
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+16
View File
@@ -58,6 +58,22 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- better-auth@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies [[`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3)]:
- better-auth@1.6.29
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+14
View File
@@ -63,6 +63,20 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies []:
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+14
View File
@@ -53,6 +53,20 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies []:
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+14
View File
@@ -57,6 +57,20 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies []:
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+16
View File
@@ -253,6 +253,22 @@
Migration: run the schema migration (`npx @better-auth/cli migrate`, or `generate` if you manage the schema yourself) to add the new resource columns.
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- better-auth@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies [[`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3)]:
- better-auth@1.6.29
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+16
View File
@@ -62,6 +62,22 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- better-auth@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies [[`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3)]:
- better-auth@1.6.29
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+14
View File
@@ -53,6 +53,20 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies []:
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+14
View File
@@ -53,6 +53,20 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies []:
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+16
View File
@@ -129,6 +129,22 @@
Connections created before this release carry no owner. Access now fails closed, so those connections are no longer reachable through the management endpoints, including token regeneration. Reclaim them at the database level: delete `scimProvider` rows that have neither `organizationId` nor `userId`, or set `userId` to the intended owner, then regenerate tokens as needed. Organization-scoped connections are not affected.
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- better-auth@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies [[`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3)]:
- better-auth@1.6.29
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+16
View File
@@ -164,6 +164,22 @@
Closes [#5604](https://github.com/better-auth/better-auth/issues/5604).
Supersedes [#4992](https://github.com/better-auth/better-auth/issues/4992) and [#5443](https://github.com/better-auth/better-auth/issues/5443).
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- better-auth@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies [[`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3)]:
- better-auth@1.6.29
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+16
View File
@@ -70,6 +70,22 @@
## 1.7.0-beta.3
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- better-auth@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies [[`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3)]:
- better-auth@1.6.29
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+14
View File
@@ -53,6 +53,20 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies []:
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes
+16
View File
@@ -58,6 +58,22 @@
## 1.7.0-beta.4
## 1.6.30
### Patch Changes
- Updated dependencies [[`07c1718`](https://github.com/better-auth/better-auth/commit/07c17189f58502bf038e5f22766f8a99df60ac99)]:
- @better-auth/core@1.6.30
- better-auth@1.6.30
## 1.6.29
### Patch Changes
- Updated dependencies [[`e6e1b4e`](https://github.com/better-auth/better-auth/commit/e6e1b4e8146a84d2a2c5fe2c497c81d03dfc2ad3)]:
- better-auth@1.6.29
- @better-auth/core@1.6.29
## 1.6.28
### Patch Changes