From 6c09f17739b56d44c07d27dd47a8f33c8449fe8b Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Tue, 3 Mar 2026 17:41:28 +0000 Subject: [PATCH 01/88] =?UTF-8?q?feat(oauth-provider):=20pairwise=20subjec?= =?UTF-8?q?t=20identifiers=20(OIDC=20Core=20=C2=A78)=20(#8292)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Alex Yang --- docs/content/docs/plugins/oauth-provider.mdx | 56 ++ packages/oauth-provider/src/introspect.ts | 26 +- packages/oauth-provider/src/metadata.ts | 4 +- packages/oauth-provider/src/oauth.ts | 8 + .../oauth-provider/src/oauthClient/index.ts | 1 + packages/oauth-provider/src/pairwise.test.ts | 569 ++++++++++++++++++ packages/oauth-provider/src/register.ts | 43 ++ packages/oauth-provider/src/schema.ts | 4 + packages/oauth-provider/src/token.ts | 4 +- packages/oauth-provider/src/types/index.ts | 10 + packages/oauth-provider/src/types/oauth.ts | 10 +- packages/oauth-provider/src/userinfo.ts | 16 + packages/oauth-provider/src/utils/index.ts | 49 ++ 13 files changed, 794 insertions(+), 6 deletions(-) create mode 100644 packages/oauth-provider/src/pairwise.test.ts diff --git a/docs/content/docs/plugins/oauth-provider.mdx b/docs/content/docs/plugins/oauth-provider.mdx index b81fdf76fe8..ca152c0e346 100644 --- a/docs/content/docs/plugins/oauth-provider.mdx +++ b/docs/content/docs/plugins/oauth-provider.mdx @@ -1368,6 +1368,56 @@ oauthProvider({ ``` +### Pairwise Subject Identifiers + +By default, the `sub` (subject) claim in tokens uses the user's internal ID, which is the same across all clients. This is the **public** subject type per [OIDC Core Section 8](https://openid.net/specs/openid-connect-core-1_0.html#SubjectIDTypes). + +You can enable **pairwise** subject identifiers so each client receives a unique, unlinkable `sub` for the same user. This prevents relying parties from correlating users across services. + +```ts title="auth.ts" +oauthProvider({ + pairwiseSecret: "your-256-bit-secret", // [!code highlight] +}) +``` + +When `pairwiseSecret` is configured, the server advertises both `"public"` and `"pairwise"` in the discovery endpoint's `subject_types_supported`. Clients opt in by setting `subject_type: "pairwise"` at registration. + +#### Per-Client Configuration + +```ts title="register-client.ts" +const response = await auth.api.createOAuthClient({ + headers, + body: { + client_name: 'Privacy-Sensitive App', + redirect_uris: ['https://app.example.com/callback'], + token_endpoint_auth_method: 'client_secret_post', + subject_type: 'pairwise', // Enable pairwise sub for this client + } +}); +``` + +#### How It Works + +Pairwise identifiers are computed using HMAC-SHA256 over the **sector identifier** (the host of the client's first redirect URI) and the user ID, keyed with `pairwiseSecret`. This means: + +- Two clients with different redirect URI hosts always receive different `sub` values for the same user +- Two clients sharing the same redirect URI host receive the **same** pairwise `sub` (per OIDC Core Section 8.1) +- The same client always receives the same `sub` for the same user (deterministic) + +Pairwise `sub` appears in: +- `id_token` +- `/oauth2/userinfo` response +- Token introspection (`/oauth2/introspect`) + +JWT access tokens always use the real user ID as `sub`, since resource servers may need to look up users directly. + + +**Limitations:** +- `sector_identifier_uri` is not yet supported. All `redirect_uris` for a pairwise client must share the same host. Clients with redirect URIs on different hosts will be rejected at registration. +- `pairwiseSecret` must be at least 32 characters long. +- Rotating `pairwiseSecret` will change all pairwise `sub` values, breaking existing RP sessions. Treat this secret as permanent once set. + + ### MCP You can easily make your APIs [MCP-compatible](https://modelcontextprotocol.io/specification/draft/basic/authorization) simply by adding a resource server which directs users to this OAuth 2.1 authorization server. @@ -1577,6 +1627,12 @@ Table Name: `oauthClient` description: "Field that indicates if the application can logout via an id_token. You may choose to enable this for trusted applications.", isOptional: true, }, + { + name: "subjectType", + type: "string", + description: "Subject identifier type for this client. Set to \"pairwise\" to receive unique, unlinkable sub claims per user. Requires pairwiseSecret to be configured on the server.", + isOptional: true, + }, { name: "scopes", type: "string[]", diff --git a/packages/oauth-provider/src/introspect.ts b/packages/oauth-provider/src/introspect.ts index 491904ff566..5683d33a40e 100644 --- a/packages/oauth-provider/src/introspect.ts +++ b/packages/oauth-provider/src/introspect.ts @@ -18,6 +18,7 @@ import { getJwtPlugin, getStoredToken, parseClientMetadata, + resolveSubjectIdentifier, validateClientCredentials, } from "./utils"; @@ -371,6 +372,27 @@ export async function validateAccessToken( }); } +/** + * Resolves pairwise sub on an introspection payload. + * Applied at the presentation layer so internal validation functions + * keep real user.id (needed for user lookup in /userinfo). + */ +async function resolveIntrospectionSub( + opts: OAuthOptions, + payload: JWTPayload, + client: SchemaClient, +): Promise { + if (payload.active && payload.sub) { + const resolvedSub = await resolveSubjectIdentifier( + payload.sub as string, + client, + opts, + ); + return { ...payload, sub: resolvedSub }; + } + return payload; +} + export async function introspectEndpoint( ctx: GenericEndpointContext, opts: OAuthOptions, @@ -429,7 +451,7 @@ export async function introspectEndpoint( token, client.clientId, ); - return payload; + return resolveIntrospectionSub(opts, payload, client); } catch (error) { if (error instanceof APIError) { if (token_type_hint === "access_token") { @@ -452,7 +474,7 @@ export async function introspectEndpoint( refreshToken.token, client.clientId, ); - return payload; + return resolveIntrospectionSub(opts, payload, client); } catch (error) { if (error instanceof APIError) { if (token_type_hint === "refresh_token") { diff --git a/packages/oauth-provider/src/metadata.ts b/packages/oauth-provider/src/metadata.ts index 50d7ab48862..213dec43852 100644 --- a/packages/oauth-provider/src/metadata.ts +++ b/packages/oauth-provider/src/metadata.ts @@ -89,7 +89,9 @@ export function oidcServerMetadata( claims_supported: opts?.advertisedMetadata?.claims_supported ?? opts?.claims ?? [], userinfo_endpoint: `${baseURL}/oauth2/userinfo`, - subject_types_supported: ["public"], + subject_types_supported: opts.pairwiseSecret + ? ["public", "pairwise"] + : ["public"], id_token_signing_alg_values_supported: jwtPluginOptions?.jwks?.keyPairConfig ?.alg ? [jwtPluginOptions?.jwks?.keyPairConfig?.alg] diff --git a/packages/oauth-provider/src/oauth.ts b/packages/oauth-provider/src/oauth.ts index 92cb0f2bf5c..005b2f9ff61 100644 --- a/packages/oauth-provider/src/oauth.ts +++ b/packages/oauth-provider/src/oauth.ts @@ -118,6 +118,13 @@ export const oauthProvider = >(options: O) => { clientRegistrationAllowedScopes, }; + // Validate pairwiseSecret minimum length + if (opts.pairwiseSecret && opts.pairwiseSecret.length < 32) { + throw new BetterAuthError( + "pairwiseSecret must be at least 32 characters long for adequate HMAC-SHA256 security", + ); + } + // TODO: device_code grant also allows for refresh tokens if ( opts.grantTypes && @@ -1131,6 +1138,7 @@ export const oauthProvider = >(options: O) => { .default(["code"]) .optional(), type: z.enum(["web", "native", "user-agent-based"]).optional(), + subject_type: z.enum(["public", "pairwise"]).optional(), }), metadata: { openapi: { diff --git a/packages/oauth-provider/src/oauthClient/index.ts b/packages/oauth-provider/src/oauthClient/index.ts index 1229c201fdc..8cbcfb63323 100644 --- a/packages/oauth-provider/src/oauthClient/index.ts +++ b/packages/oauth-provider/src/oauthClient/index.ts @@ -57,6 +57,7 @@ export const adminCreateOAuthClient = (opts: OAuthOptions) => skip_consent: z.boolean().optional(), enable_end_session: z.boolean().optional(), require_pkce: z.boolean().optional(), + subject_type: z.enum(["public", "pairwise"]).optional(), metadata: z.record(z.string(), z.unknown()).optional(), }), metadata: { diff --git a/packages/oauth-provider/src/pairwise.test.ts b/packages/oauth-provider/src/pairwise.test.ts new file mode 100644 index 00000000000..fedae757248 --- /dev/null +++ b/packages/oauth-provider/src/pairwise.test.ts @@ -0,0 +1,569 @@ +import { createAuthClient } from "better-auth/client"; +import { generateRandomString } from "better-auth/crypto"; +import { + createAuthorizationCodeRequest, + createAuthorizationURL, +} from "better-auth/oauth2"; +import { jwt } from "better-auth/plugins/jwt"; +import { getTestInstance } from "better-auth/test"; +import { APIError } from "better-call"; +import { decodeJwt } from "jose"; +import { beforeAll, describe, expect, it } from "vitest"; +import { oauthProviderClient } from "./client"; +import { oauthProvider } from "./oauth"; +import type { OAuthClient } from "./types/oauth"; + +describe("pairwise subject identifiers", async () => { + const authServerBaseUrl = "http://localhost:3000"; + const rpBaseUrl = "http://localhost:5000"; + const rpBaseUrl2 = "http://localhost:6000"; + const validAudience = "https://myapi.example.com"; + + const { auth, signInWithTestUser, customFetchImpl } = await getTestInstance({ + baseURL: authServerBaseUrl, + plugins: [ + jwt({ + jwt: { + issuer: authServerBaseUrl, + }, + }), + oauthProvider({ + loginPage: "/login", + consentPage: "/consent", + pairwiseSecret: "test-pairwise-secret-key-32chars!!", + validAudiences: [validAudience], + allowDynamicClientRegistration: true, + silenceWarnings: { + oauthAuthServerConfig: true, + openidConfig: true, + }, + }), + ], + }); + + const { headers } = await signInWithTestUser(); + const client = createAuthClient({ + plugins: [oauthProviderClient()], + baseURL: authServerBaseUrl, + fetchOptions: { + customFetchImpl, + headers, + }, + }); + + let pairwiseClientA: OAuthClient | null; + let pairwiseClientB: OAuthClient | null; + let publicClient: OAuthClient | null; + let sameHostClientA: OAuthClient | null; + + const redirectUriA = `${rpBaseUrl}/api/auth/oauth2/callback/test-a`; + const redirectUriB = `${rpBaseUrl2}/api/auth/oauth2/callback/test-b`; + const redirectUriSameHost = `${rpBaseUrl}/api/auth/oauth2/callback/test-same`; + const redirectUriPublic = `${rpBaseUrl}/api/auth/oauth2/callback/test-public`; + + beforeAll(async () => { + pairwiseClientA = await auth.api.adminCreateOAuthClient({ + headers, + body: { + redirect_uris: [redirectUriA], + scope: "openid profile email offline_access", + skip_consent: true, + subject_type: "pairwise", + }, + }); + expect(pairwiseClientA?.client_id).toBeDefined(); + + pairwiseClientB = await auth.api.adminCreateOAuthClient({ + headers, + body: { + redirect_uris: [redirectUriB], + scope: "openid profile email offline_access", + skip_consent: true, + subject_type: "pairwise", + }, + }); + expect(pairwiseClientB?.client_id).toBeDefined(); + + publicClient = await auth.api.adminCreateOAuthClient({ + headers, + body: { + redirect_uris: [redirectUriPublic], + scope: "openid profile email offline_access", + skip_consent: true, + }, + }); + expect(publicClient?.client_id).toBeDefined(); + + sameHostClientA = await auth.api.adminCreateOAuthClient({ + headers, + body: { + redirect_uris: [redirectUriSameHost], + scope: "openid profile email offline_access", + skip_consent: true, + subject_type: "pairwise", + }, + }); + expect(sameHostClientA?.client_id).toBeDefined(); + }); + + async function getTokensForClient( + oauthClient: OAuthClient, + redirectUri: string, + overrides?: { + resource?: string; + }, + ) { + const codeVerifier = generateRandomString(32); + const url = await createAuthorizationURL({ + id: "test", + options: { + clientId: oauthClient.client_id, + clientSecret: oauthClient.client_secret!, + redirectURI: redirectUri, + }, + redirectURI: "", + authorizationEndpoint: `${authServerBaseUrl}/api/auth/oauth2/authorize`, + state: "test-state", + scopes: ["openid", "profile", "email", "offline_access"], + codeVerifier, + }); + + let callbackRedirectUrl = ""; + await client.$fetch(url.toString(), { + headers, + onError(context) { + callbackRedirectUrl = context.response.headers.get("Location") || ""; + }, + }); + const callbackUrl = new URL(callbackRedirectUrl); + const code = callbackUrl.searchParams.get("code")!; + + const { body, headers: reqHeaders } = createAuthorizationCodeRequest({ + code, + codeVerifier, + redirectURI: redirectUri, + options: { + clientId: oauthClient.client_id, + clientSecret: oauthClient.client_secret!, + redirectURI: redirectUri, + }, + resource: overrides?.resource, + }); + + const tokens = await client.$fetch<{ + access_token?: string; + id_token?: string; + refresh_token?: string; + expires_in?: number; + token_type?: string; + scope?: string; + }>("/oauth2/token", { + method: "POST", + body, + headers: reqHeaders, + }); + + return tokens; + } + + it("should produce different sub across pairwise clients (cross-RP unlinkability)", async () => { + const tokensA = await getTokensForClient(pairwiseClientA!, redirectUriA); + const tokensB = await getTokensForClient(pairwiseClientB!, redirectUriB); + + const idTokenA = decodeJwt(tokensA.data!.id_token!); + const idTokenB = decodeJwt(tokensB.data!.id_token!); + + expect(idTokenA.sub).toBeDefined(); + expect(idTokenB.sub).toBeDefined(); + // Different sectors โ†’ different pairwise sub + expect(idTokenA.sub).not.toBe(idTokenB.sub); + }); + + it("should produce same sub for same pairwise client (determinism)", async () => { + const tokens1 = await getTokensForClient(pairwiseClientA!, redirectUriA); + const tokens2 = await getTokensForClient(pairwiseClientA!, redirectUriA); + + const idToken1 = decodeJwt(tokens1.data!.id_token!); + const idToken2 = decodeJwt(tokens2.data!.id_token!); + + expect(idToken1.sub).toBe(idToken2.sub); + }); + + it("should return user.id as sub for public client (fallback)", async () => { + const publicTokens = await getTokensForClient( + publicClient!, + redirectUriPublic, + ); + const pairwiseTokens = await getTokensForClient( + pairwiseClientA!, + redirectUriA, + ); + + const publicIdToken = decodeJwt(publicTokens.data!.id_token!); + const pairwiseIdToken = decodeJwt(pairwiseTokens.data!.id_token!); + + expect(publicIdToken.sub).toBeDefined(); + // Public sub differs from pairwise sub for same user + expect(publicIdToken.sub).not.toBe(pairwiseIdToken.sub); + }); + + it("should produce same pairwise sub for clients on same host (sector isolation)", async () => { + const tokensA = await getTokensForClient(pairwiseClientA!, redirectUriA); + const tokensSameHost = await getTokensForClient( + sameHostClientA!, + redirectUriSameHost, + ); + + const idTokenA = decodeJwt(tokensA.data!.id_token!); + const idTokenSameHost = decodeJwt(tokensSameHost.data!.id_token!); + + // Same host (localhost) โ†’ same sector โ†’ same pairwise sub + expect(idTokenA.sub).toBe(idTokenSameHost.sub); + }); + + it("should have consistent sub between id_token and userinfo", async () => { + const tokens = await getTokensForClient(pairwiseClientA!, redirectUriA); + const idToken = decodeJwt(tokens.data!.id_token!); + + const userinfo = await client.$fetch<{ sub?: string }>("/oauth2/userinfo", { + method: "GET", + headers: { + authorization: `Bearer ${tokens.data!.access_token}`, + }, + }); + + expect(userinfo.data?.sub).toBe(idToken.sub); + }); + + it("should return pairwise sub in opaque access token introspection", async () => { + const tokens = await getTokensForClient(pairwiseClientA!, redirectUriA); + + const introspection = await client.oauth2.introspect( + { + client_id: pairwiseClientA!.client_id, + client_secret: pairwiseClientA!.client_secret, + token: tokens.data!.access_token!, + token_type_hint: "access_token", + }, + { + headers: { + accept: "application/json", + "content-type": "application/x-www-form-urlencoded", + }, + }, + ); + + const idToken = decodeJwt(tokens.data!.id_token!); + expect(introspection.data?.active).toBe(true); + expect(introspection.data?.sub).toBe(idToken.sub); + }); + + it("should preserve pairwise sub after token refresh", async () => { + const tokens = await getTokensForClient(pairwiseClientA!, redirectUriA); + const originalIdToken = decodeJwt(tokens.data!.id_token!); + + const refreshBody = new URLSearchParams({ + grant_type: "refresh_token", + client_id: pairwiseClientA!.client_id, + client_secret: pairwiseClientA!.client_secret!, + refresh_token: tokens.data!.refresh_token!, + }); + + const refreshResponse = await client.$fetch<{ + access_token?: string; + id_token?: string; + refresh_token?: string; + }>("/oauth2/token", { + method: "POST", + body: refreshBody, + headers: { + "content-type": "application/x-www-form-urlencoded", + }, + }); + + expect(refreshResponse.data?.id_token).toBeDefined(); + const refreshedIdToken = decodeJwt(refreshResponse.data!.id_token!); + expect(refreshedIdToken.sub).toBe(originalIdToken.sub); + }); + + it("should keep user.id in JWT access token sub (not pairwise)", async () => { + const tokens = await getTokensForClient(pairwiseClientA!, redirectUriA, { + resource: validAudience, + }); + + const accessToken = decodeJwt(tokens.data!.access_token!); + const idToken = decodeJwt(tokens.data!.id_token!); + + // JWT access token uses real user.id for user lookup + expect(accessToken.sub).toBeDefined(); + expect(accessToken.sub).not.toBe(idToken.sub); + }); +}); + +describe("pairwise DCR validation", async () => { + const authServerBaseUrl = "http://localhost:3000"; + const rpBaseUrl = "http://localhost:5000"; + const redirectUri = `${rpBaseUrl}/api/auth/oauth2/callback/test`; + + it("should reject pairwise subject_type when pairwiseSecret not configured", async () => { + const { auth, signInWithTestUser } = await getTestInstance({ + baseURL: authServerBaseUrl, + plugins: [ + jwt(), + oauthProvider({ + loginPage: "/login", + consentPage: "/consent", + silenceWarnings: { + oauthAuthServerConfig: true, + openidConfig: true, + }, + }), + ], + }); + + const { headers } = await signInWithTestUser(); + await expect( + auth.api.adminCreateOAuthClient({ + headers, + body: { + redirect_uris: [redirectUri], + subject_type: "pairwise", + }, + }), + ).rejects.toThrow(APIError); + }); + + it("should accept pairwise subject_type when pairwiseSecret is configured", async () => { + const { auth, signInWithTestUser } = await getTestInstance({ + baseURL: authServerBaseUrl, + plugins: [ + jwt(), + oauthProvider({ + loginPage: "/login", + consentPage: "/consent", + pairwiseSecret: "test-secret-for-dcr-test-32chars!", + silenceWarnings: { + oauthAuthServerConfig: true, + openidConfig: true, + }, + }), + ], + }); + + const { headers } = await signInWithTestUser(); + const response = await auth.api.adminCreateOAuthClient({ + headers, + body: { + redirect_uris: [redirectUri], + subject_type: "pairwise", + skip_consent: true, + }, + }); + + expect(response?.client_id).toBeDefined(); + expect(response?.subject_type).toBe("pairwise"); + }); + + it("should default to public when no subject_type specified", async () => { + const { auth, signInWithTestUser } = await getTestInstance({ + baseURL: authServerBaseUrl, + plugins: [ + jwt(), + oauthProvider({ + loginPage: "/login", + consentPage: "/consent", + pairwiseSecret: "test-secret-for-dcr-test-32chars!", + silenceWarnings: { + oauthAuthServerConfig: true, + openidConfig: true, + }, + }), + ], + }); + + const { headers } = await signInWithTestUser(); + const response = await auth.api.adminCreateOAuthClient({ + headers, + body: { + redirect_uris: [redirectUri], + skip_consent: true, + }, + }); + + expect(response?.client_id).toBeDefined(); + expect(response?.subject_type).toBeUndefined(); + }); + + it("should reject pairwise client with redirect_uris on different hosts", async () => { + const { auth, signInWithTestUser } = await getTestInstance({ + baseURL: authServerBaseUrl, + plugins: [ + jwt(), + oauthProvider({ + loginPage: "/login", + consentPage: "/consent", + pairwiseSecret: "test-secret-for-dcr-test-32chars!", + silenceWarnings: { + oauthAuthServerConfig: true, + openidConfig: true, + }, + }), + ], + }); + + const { headers } = await signInWithTestUser(); + await expect( + auth.api.adminCreateOAuthClient({ + headers, + body: { + redirect_uris: [ + "https://app-a.example.com/callback", + "https://app-b.example.com/callback", + ], + subject_type: "pairwise", + }, + }), + ).rejects.toThrow(APIError); + }); + + it("should accept pairwise client with redirect_uris on the same host", async () => { + const { auth, signInWithTestUser } = await getTestInstance({ + baseURL: authServerBaseUrl, + plugins: [ + jwt(), + oauthProvider({ + loginPage: "/login", + consentPage: "/consent", + pairwiseSecret: "test-secret-for-dcr-test-32chars!", + silenceWarnings: { + oauthAuthServerConfig: true, + openidConfig: true, + }, + }), + ], + }); + + const { headers } = await signInWithTestUser(); + const response = await auth.api.adminCreateOAuthClient({ + headers, + body: { + redirect_uris: [ + "https://app.example.com/callback-a", + "https://app.example.com/callback-b", + ], + subject_type: "pairwise", + skip_consent: true, + }, + }); + + expect(response?.client_id).toBeDefined(); + expect(response?.subject_type).toBe("pairwise"); + }); + + it("should round-trip subject_type through DCR", async () => { + const { signInWithTestUser, customFetchImpl } = await getTestInstance({ + baseURL: authServerBaseUrl, + plugins: [ + jwt(), + oauthProvider({ + loginPage: "/login", + consentPage: "/consent", + pairwiseSecret: "test-secret-for-dcr-test-32chars!", + allowDynamicClientRegistration: true, + silenceWarnings: { + oauthAuthServerConfig: true, + openidConfig: true, + }, + }), + ], + }); + + const { headers } = await signInWithTestUser(); + const dcrClient = createAuthClient({ + plugins: [oauthProviderClient()], + baseURL: authServerBaseUrl, + fetchOptions: { + customFetchImpl, + headers, + }, + }); + + const response = await dcrClient.$fetch("/oauth2/register", { + method: "POST", + body: { + redirect_uris: [redirectUri], + subject_type: "pairwise", + token_endpoint_auth_method: "none", + }, + }); + + expect(response.data?.subject_type).toBe("pairwise"); + }); +}); + +describe("pairwise configuration validation", () => { + it("should reject pairwiseSecret shorter than 32 characters", () => { + expect(() => + oauthProvider({ + loginPage: "/login", + consentPage: "/consent", + pairwiseSecret: "too-short", + }), + ).toThrow("pairwiseSecret must be at least 32 characters"); + }); + + it("should accept pairwiseSecret of 32+ characters", () => { + expect(() => + oauthProvider({ + loginPage: "/login", + consentPage: "/consent", + pairwiseSecret: "a-valid-secret-that-is-32-chars!", + }), + ).not.toThrow(); + }); +}); + +describe("pairwise metadata", async () => { + const authServerBaseUrl = "http://localhost:3000"; + + it("should include pairwise in subject_types_supported when secret configured", async () => { + const { auth } = await getTestInstance({ + baseURL: authServerBaseUrl, + plugins: [ + jwt(), + oauthProvider({ + loginPage: "/login", + consentPage: "/consent", + pairwiseSecret: "test-pairwise-metadata-secret!!!", + silenceWarnings: { + oauthAuthServerConfig: true, + openidConfig: true, + }, + }), + ], + }); + + const metadata = await auth.api.getOpenIdConfig(); + expect(metadata.subject_types_supported).toEqual(["public", "pairwise"]); + }); + + it("should only include public when no pairwise secret", async () => { + const { auth } = await getTestInstance({ + baseURL: authServerBaseUrl, + plugins: [ + jwt(), + oauthProvider({ + loginPage: "/login", + consentPage: "/consent", + silenceWarnings: { + oauthAuthServerConfig: true, + openidConfig: true, + }, + }), + ], + }); + + const metadata = await auth.api.getOpenIdConfig(); + expect(metadata.subject_types_supported).toEqual(["public"]); + }); +}); diff --git a/packages/oauth-provider/src/register.ts b/packages/oauth-provider/src/register.ts index 94ae1113de1..05a830c4a22 100644 --- a/packages/oauth-provider/src/register.ts +++ b/packages/oauth-provider/src/register.ts @@ -110,6 +110,45 @@ export async function checkOAuthClient( }); } + // Validate subject_type + if (client.subject_type !== undefined) { + if ( + client.subject_type !== "public" && + client.subject_type !== "pairwise" + ) { + throw new APIError("BAD_REQUEST", { + error: "invalid_client_metadata", + error_description: `subject_type must be "public" or "pairwise"`, + }); + } + if (client.subject_type === "pairwise" && !opts.pairwiseSecret) { + throw new APIError("BAD_REQUEST", { + error: "invalid_client_metadata", + error_description: + "pairwise subject_type requires server pairwiseSecret configuration", + }); + } + // Per OIDC Core ยง8.1, when multiple redirect_uris have different hosts, + // a sector_identifier_uri is required (not yet supported). Reject registration + // until sector_identifier_uri support is added. + if ( + client.subject_type === "pairwise" && + client.redirect_uris && + client.redirect_uris.length > 1 + ) { + const hosts = new Set( + client.redirect_uris.map((uri: string) => new URL(uri).host), + ); + if (hosts.size > 1) { + throw new APIError("BAD_REQUEST", { + error: "invalid_client_metadata", + error_description: + "pairwise clients with redirect_uris on different hosts require a sector_identifier_uri, which is not yet supported. All redirect_uris must share the same host.", + }); + } + } + } + // Check requested application scopes const requestedScopes = (client?.scope as string | undefined) ?.split(" ") @@ -263,6 +302,7 @@ export function oauthToSchema(input: OAuthClient): SchemaClient { skip_consent: skipConsent, enable_end_session: enableEndSession, require_pkce: requirePKCE, + subject_type: subjectType, reference_id: referenceId, metadata: inputMetadata, // All other metadata @@ -317,6 +357,7 @@ export function oauthToSchema(input: OAuthClient): SchemaClient { skipConsent, enableEndSession, requirePKCE, + subjectType, referenceId, metadata, }; @@ -364,6 +405,7 @@ export function schemaToOAuth(input: SchemaClient): OAuthClient { skipConsent, enableEndSession, requirePKCE, + subjectType, referenceId, metadata, // in JSON format } = input; @@ -417,6 +459,7 @@ export function schemaToOAuth(input: SchemaClient): OAuthClient { skip_consent: skipConsent ?? undefined, enable_end_session: enableEndSession ?? undefined, require_pkce: requirePKCE ?? undefined, + subject_type: subjectType ?? undefined, reference_id: referenceId ?? undefined, }; } diff --git a/packages/oauth-provider/src/schema.ts b/packages/oauth-provider/src/schema.ts index ddf1b063cc7..5d116af4930 100644 --- a/packages/oauth-provider/src/schema.ts +++ b/packages/oauth-provider/src/schema.ts @@ -27,6 +27,10 @@ export const schema = { type: "boolean", required: false, }, + subjectType: { + type: "string", + required: false, + }, scopes: { type: "string[]", required: false, diff --git a/packages/oauth-provider/src/token.ts b/packages/oauth-provider/src/token.ts index f632f11eee6..7d3d493edcf 100644 --- a/packages/oauth-provider/src/token.ts +++ b/packages/oauth-provider/src/token.ts @@ -22,6 +22,7 @@ import { getStoredToken, isPKCERequired, parseClientMetadata, + resolveSubjectIdentifier, storeToken, validateClientCredentials, } from "./utils"; @@ -132,6 +133,7 @@ async function createIdToken( const iat = Math.floor(Date.now() / 1000); const exp = iat + (opts.idTokenExpiresIn ?? 36000); const userClaims = userNormalClaims(user, scopes); + const resolvedSub = await resolveSubjectIdentifier(user.id, client, opts); const authTimeSec = authTime != null ? Math.floor(authTime.getTime() / 1000) : undefined; // TODO: this should be validated against the login process @@ -157,7 +159,7 @@ async function createIdToken( auth_time: authTimeSec, acr, iss: jwtPluginOptions?.jwt?.issuer ?? ctx.context.baseURL, - sub: user.id, + sub: resolvedSub, aud: client.clientId, nonce, iat, diff --git a/packages/oauth-provider/src/types/index.ts b/packages/oauth-provider/src/types/index.ts index facdfc4a7af..528cd4b6694 100644 --- a/packages/oauth-provider/src/types/index.ts +++ b/packages/oauth-provider/src/types/index.ts @@ -664,6 +664,14 @@ export interface OAuthOptions< */ userinfo?: { window: number; max: number } | false; }; + /** + * Secret used to compute pairwise subject identifiers (HMAC-SHA256). + * When set, clients with `subject_type: "pairwise"` receive unique, + * unlinkable `sub` values per sector identifier. + * + * @see https://openid.net/specs/openid-connect-core-1_0.html#PairwiseAlg + */ + pairwiseSecret?: string; } export interface OAuthAuthorizationQuery { @@ -907,6 +915,8 @@ export interface SchemaClient< skipConsent?: boolean; /** Used to enable client to logout via the `/oauth2/end-session` endpoint */ enableEndSession?: boolean; + /** Subject identifier type: "public" (default) or "pairwise" */ + subjectType?: "public" | "pairwise"; /** Reference to the owner of this client. Eg. Organization, Team, Profile */ referenceId?: string; /** diff --git a/packages/oauth-provider/src/types/oauth.ts b/packages/oauth-provider/src/types/oauth.ts index 760d25d77d8..7de56189dbb 100644 --- a/packages/oauth-provider/src/types/oauth.ts +++ b/packages/oauth-provider/src/types/oauth.ts @@ -216,9 +216,9 @@ export interface OIDCMetadata extends AuthServerMetadata { * pairwise: the subject identifier is unique to the client * public: the subject identifier is unique to the server * - * only `public` is supported. + * @see https://openid.net/specs/openid-connect-core-1_0.html#SubjectIDTypes */ - subject_types_supported: "public"[]; + subject_types_supported: ("public" | "pairwise")[]; /** * Supported ID token signing algorithms. * @@ -307,6 +307,12 @@ export interface OAuthClient { * requesting offline_access scope, regardless of this setting. */ require_pkce?: boolean; + /** + * Subject identifier type for this client. + * + * @see https://openid.net/specs/openid-connect-core-1_0.html#SubjectIDTypes + */ + subject_type?: "public" | "pairwise"; //---- All other metadata ----// reference_id?: string; [key: string]: unknown; diff --git a/packages/oauth-provider/src/userinfo.ts b/packages/oauth-provider/src/userinfo.ts index 109651f4082..f204b96261e 100644 --- a/packages/oauth-provider/src/userinfo.ts +++ b/packages/oauth-provider/src/userinfo.ts @@ -3,6 +3,7 @@ import { APIError } from "better-auth/api"; import type { User } from "better-auth/types"; import { validateAccessToken } from "./introspect"; import type { OAuthOptions, Scope } from "./types"; +import { getClient, resolveSubjectIdentifier } from "./utils"; /** * Provides shared /userinfo and id_token claims functionality @@ -80,6 +81,21 @@ export async function userInfoEndpoint( } const baseUserClaims = userNormalClaims(user, scopes ?? []); + + // Resolve pairwise sub if server has pairwise enabled and client is configured for it + if (opts.pairwiseSecret) { + const clientId = (jwt.client_id ?? jwt.azp) as string | undefined; + if (clientId) { + const client = await getClient(ctx, opts, clientId); + if (client) { + baseUserClaims.sub = await resolveSubjectIdentifier( + user.id, + client, + opts, + ); + } + } + } const additionalInfoUserClaims = opts.customUserInfoClaims && scopes?.length ? await opts.customUserInfoClaims({ user, scopes, jwt }) diff --git a/packages/oauth-provider/src/utils/index.ts b/packages/oauth-provider/src/utils/index.ts index 4739a598d37..0dc5a61e0a5 100644 --- a/packages/oauth-provider/src/utils/index.ts +++ b/packages/oauth-provider/src/utils/index.ts @@ -4,6 +4,7 @@ import { base64, base64Url } from "@better-auth/utils/base64"; import { createHash } from "@better-auth/utils/hash"; import { constantTimeEqual, + makeSignature, symmetricDecrypt, symmetricEncrypt, } from "better-auth/crypto"; @@ -418,6 +419,54 @@ export function parsePrompt(prompt: string) { return new Set(set); } +/** + * Extracts the sector identifier (hostname) from a client's first redirect URI. + * + * @see https://openid.net/specs/openid-connect-core-1_0.html#PairwiseAlg + * @internal + */ +export function getSectorIdentifier(client: SchemaClient): string { + const uri = client.redirectUris?.[0]; + if (!uri) { + throw new BetterAuthError( + "Client has no redirect URIs for sector identifier", + ); + } + return new URL(uri).host; +} + +/** + * Computes a pairwise subject identifier using HMAC-SHA256. + * + * @see https://openid.net/specs/openid-connect-core-1_0.html#PairwiseAlg + * @internal + */ +export async function computePairwiseSub( + userId: string, + client: SchemaClient, + secret: string, +): Promise { + const sectorId = getSectorIdentifier(client); + return makeSignature(`${sectorId}.${userId}`, secret); +} + +/** + * Returns the appropriate subject identifier for a user+client pair. + * Uses pairwise when the client opts in and the server has a secret configured. + * + * @internal + */ +export async function resolveSubjectIdentifier( + userId: string, + client: SchemaClient, + opts: OAuthOptions, +): Promise { + if (client.subjectType === "pairwise" && opts.pairwiseSecret) { + return computePairwiseSub(userId, client, opts.pairwiseSecret); + } + return userId; +} + /** * Deletes a prompt value * From eb848c4d7192b1290ae1cc7326fc77cc3aa5d42d Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Fri, 6 Mar 2026 12:46:10 -0800 Subject: [PATCH 02/88] fix(adapters): restore deprecated createAdapter and type exports for backcompat (#8461) --- docs/content/blogs/1-5.mdx | 1 - packages/better-auth/src/adapters/index.ts | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/content/blogs/1-5.mdx b/docs/content/blogs/1-5.mdx index 7cb9ccdf564..b29ae70ae6e 100644 --- a/docs/content/blogs/1-5.mdx +++ b/docs/content/blogs/1-5.mdx @@ -694,7 +694,6 @@ All previously deprecated APIs have been removed. This includes deprecated adapt | Removed | Replacement | | --- | --- | -| `createAdapter` | `createAdapterFactory` | | `Adapter` | `DBAdapter` | | `TransactionAdapter` | `DBTransactionAdapter` | | `Store` (client) | `ClientStore` | diff --git a/packages/better-auth/src/adapters/index.ts b/packages/better-auth/src/adapters/index.ts index cd852588a3c..2d4e8e90d84 100644 --- a/packages/better-auth/src/adapters/index.ts +++ b/packages/better-auth/src/adapters/index.ts @@ -35,3 +35,23 @@ export { initGetFieldAttributes, initGetIdField, }; + +/** + * @deprecated Use `createAdapterFactory` instead. + */ +export const createAdapter = createAdapterFactory; + +/** + * @deprecated Use `AdapterFactoryOptions` instead. + */ +export type CreateAdapterOptions = AdapterFactoryOptions; + +/** + * @deprecated Use `AdapterFactoryConfig` instead. + */ +export type AdapterConfig = AdapterFactoryConfig; + +/** + * @deprecated Use `AdapterFactoryCustomizeAdapterCreator` instead. + */ +export type CreateCustomAdapter = AdapterFactoryCustomizeAdapterCreator; From 3ecd22d876fed2f6fa255022dcea9ba5a6593127 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Fri, 6 Mar 2026 14:20:50 -0800 Subject: [PATCH 03/88] fix(telemetry): use conditional exports to replace dynamic import hacks (#8458) --- packages/telemetry/package.json | 1 + .../src/detectors/detect-system-info.ts | 136 +------ packages/telemetry/src/node.ts | 381 ++++++++++++++++++ packages/telemetry/src/utils/import-util.ts | 3 - packages/telemetry/src/utils/package-json.ts | 80 +--- packages/telemetry/tsdown.config.ts | 20 +- 6 files changed, 423 insertions(+), 198 deletions(-) create mode 100644 packages/telemetry/src/node.ts delete mode 100644 packages/telemetry/src/utils/import-util.ts diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index d7a18d2c72b..853653ad7b8 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -36,6 +36,7 @@ ".": { "dev-source": "./src/index.ts", "types": "./dist/index.d.mts", + "node": "./dist/node.mjs", "default": "./dist/index.mjs" } }, diff --git a/packages/telemetry/src/detectors/detect-system-info.ts b/packages/telemetry/src/detectors/detect-system-info.ts index 248d10e1e9d..7379c8eb2bb 100644 --- a/packages/telemetry/src/detectors/detect-system-info.ts +++ b/packages/telemetry/src/detectors/detect-system-info.ts @@ -1,5 +1,4 @@ import { env } from "@better-auth/core/env"; -import { importRuntime } from "../utils/import-util"; function getVendor() { const hasAny = (...keys: string[]) => @@ -73,131 +72,30 @@ function getVendor() { return null; } +// In the default (non-node) build, system info detection is not available. +// The node build (src/node.ts) provides its own inline implementation +// using static top-level imports of node:os and node:fs. export async function detectSystemInfo() { - try { - //check if it's cloudflare - if (getVendor() === "cloudflare") return "cloudflare"; - const os = await importRuntime("os"); - const cpus = os.cpus(); - return { - deploymentVendor: getVendor(), - systemPlatform: os.platform(), - systemRelease: os.release(), - systemArchitecture: os.arch(), - cpuCount: cpus.length, - cpuModel: cpus.length ? cpus[0]!.model : null, - cpuSpeed: cpus.length ? cpus[0]!.speed : null, - memory: os.totalmem(), - isWSL: await isWsl(), - isDocker: await isDocker(), - isTTY: - typeof process !== "undefined" && (process as any).stdout - ? (process as any).stdout.isTTY - : null, - }; - } catch { - return { - systemPlatform: null, - systemRelease: null, - systemArchitecture: null, - cpuCount: null, - cpuModel: null, - cpuSpeed: null, - memory: null, - isWSL: null, - isDocker: null, - isTTY: null, - }; - } -} - -let isDockerCached: boolean | undefined; - -async function hasDockerEnv() { - if (getVendor() === "cloudflare") return false; - - try { - const fs = await importRuntime("fs"); - fs.statSync("/.dockerenv"); - return true; - } catch { - return false; - } -} - -async function hasDockerCGroup() { - if (getVendor() === "cloudflare") return false; - try { - const fs = await importRuntime("fs"); - return fs.readFileSync("/proc/self/cgroup", "utf8").includes("docker"); - } catch { - return false; - } -} - -async function isDocker() { - if (getVendor() === "cloudflare") return false; - - if (isDockerCached === undefined) { - isDockerCached = (await hasDockerEnv()) || (await hasDockerCGroup()); - } - - return isDockerCached; -} - -async function isWsl() { - try { - if (getVendor() === "cloudflare") return false; - if (typeof process === "undefined" || process?.platform !== "linux") { - return false; - } - const fs = await importRuntime("fs"); - const os = await importRuntime("os"); - if (os.release().toLowerCase().includes("microsoft")) { - if (await isInsideContainer()) { - return false; - } - - return true; - } - - return fs - .readFileSync("/proc/version", "utf8") - .toLowerCase() - .includes("microsoft") - ? !(await isInsideContainer()) - : false; - } catch { - return false; - } -} - -let isInsideContainerCached: boolean | undefined; - -const hasContainerEnv = async () => { - if (getVendor() === "cloudflare") return false; - try { - const fs = await importRuntime("fs"); - fs.statSync("/run/.containerenv"); - return true; - } catch { - return false; - } -}; - -async function isInsideContainer() { - if (isInsideContainerCached === undefined) { - isInsideContainerCached = (await hasContainerEnv()) || (await isDocker()); - } - - return isInsideContainerCached; + return { + deploymentVendor: getVendor(), + systemPlatform: null, + systemRelease: null, + systemArchitecture: null, + cpuCount: null, + cpuModel: null, + cpuSpeed: null, + memory: null, + isWSL: null, + isDocker: null, + isTTY: null, + }; } export function isCI() { return ( env.CI !== "false" && ("BUILD_ID" in env || // Jenkins, Cloudbees - "BUILD_NUMBER" in env || // Jenkins, TeamCity (fixed typo: extra space removed) + "BUILD_NUMBER" in env || // Jenkins, TeamCity "CI" in env || // Travis CI, CircleCI, Cirrus CI, Gitlab CI, Appveyor, CodeShip, dsari, Cloudflare "CI_APP_ID" in env || // Appflow "CI_BUILD_ID" in env || // Appflow diff --git a/packages/telemetry/src/node.ts b/packages/telemetry/src/node.ts new file mode 100644 index 00000000000..40e7b36f657 --- /dev/null +++ b/packages/telemetry/src/node.ts @@ -0,0 +1,381 @@ +import fs from "node:fs"; +import fsPromises from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import type { BetterAuthOptions } from "@better-auth/core"; +import { ENV, getBooleanEnvVar, isTest, logger } from "@better-auth/core/env"; +import { betterFetch } from "@better-fetch/fetch"; +import type { PackageJson } from "type-fest"; +import { getTelemetryAuthConfig } from "./detectors/detect-auth-config"; +import { detectPackageManager } from "./detectors/detect-project-info"; +import { detectEnvironment, detectRuntime } from "./detectors/detect-runtime"; +import type { TelemetryContext, TelemetryEvent } from "./types"; +import { hashToBase64 } from "./utils/hash"; +import { generateId } from "./utils/id"; +export { getTelemetryAuthConfig }; +export type { TelemetryEvent } from "./types"; + +// --- Node-specific: package.json reading --- + +let packageJSONCache: PackageJson | undefined; + +async function readRootPackageJson(): Promise { + if (packageJSONCache) return packageJSONCache; + try { + const cwd = process.cwd(); + if (!cwd) return undefined; + const raw = await fsPromises.readFile( + path.join(cwd, "package.json"), + "utf-8", + ); + packageJSONCache = JSON.parse(raw); + return packageJSONCache as PackageJson; + } catch {} + return undefined; +} + +async function getPackageVersion(pkg: string): Promise { + if (packageJSONCache) { + return (packageJSONCache.dependencies?.[pkg] || + packageJSONCache.devDependencies?.[pkg] || + packageJSONCache.peerDependencies?.[pkg]) as string | undefined; + } + + try { + const cwd = process.cwd(); + if (!cwd) throw new Error("no-cwd"); + const pkgJsonPath = path.join(cwd, "node_modules", pkg, "package.json"); + const raw = await fsPromises.readFile(pkgJsonPath, "utf-8"); + const json = JSON.parse(raw); + const resolved = + (json.version as string) || + (await getVersionFromLocalPackageJson(pkg)) || + undefined; + return resolved; + } catch {} + + return getVersionFromLocalPackageJson(pkg); +} + +async function getVersionFromLocalPackageJson( + pkg: string, +): Promise { + const json = await readRootPackageJson(); + if (!json) return undefined; + const allDeps = { + ...json.dependencies, + ...json.devDependencies, + ...json.peerDependencies, + } as Record; + return allDeps[pkg]; +} + +async function getNameFromLocalPackageJson(): Promise { + const json = await readRootPackageJson(); + return json?.name as string | undefined; +} + +// --- Node-specific: system info --- + +async function detectSystemInfo() { + try { + const cpus = os.cpus(); + return { + deploymentVendor: getVendor(), + systemPlatform: os.platform(), + systemRelease: os.release(), + systemArchitecture: os.arch(), + cpuCount: cpus.length, + cpuModel: cpus.length ? cpus[0]!.model : null, + cpuSpeed: cpus.length ? cpus[0]!.speed : null, + memory: os.totalmem(), + isWSL: await isWsl(), + isDocker: await isDocker(), + isTTY: (process as any).stdout ? (process as any).stdout.isTTY : null, + }; + } catch { + return { + systemPlatform: null, + systemRelease: null, + systemArchitecture: null, + cpuCount: null, + cpuModel: null, + cpuSpeed: null, + memory: null, + isWSL: null, + isDocker: null, + isTTY: null, + }; + } +} + +function getVendor() { + const env = process.env as Record; + const hasAny = (...keys: string[]) => keys.some((k) => Boolean(env[k])); + + if ( + hasAny("CF_PAGES", "CF_PAGES_URL", "CF_ACCOUNT_ID") || + (typeof navigator !== "undefined" && + navigator.userAgent === "Cloudflare-Workers") + ) { + return "cloudflare"; + } + + if (hasAny("VERCEL", "VERCEL_URL", "VERCEL_ENV")) return "vercel"; + if (hasAny("NETLIFY", "NETLIFY_URL")) return "netlify"; + if ( + hasAny( + "RENDER", + "RENDER_URL", + "RENDER_INTERNAL_HOSTNAME", + "RENDER_SERVICE_ID", + ) + ) + return "render"; + if ( + hasAny("AWS_LAMBDA_FUNCTION_NAME", "AWS_EXECUTION_ENV", "LAMBDA_TASK_ROOT") + ) + return "aws"; + if ( + hasAny( + "GOOGLE_CLOUD_FUNCTION_NAME", + "GOOGLE_CLOUD_PROJECT", + "GCP_PROJECT", + "K_SERVICE", + ) + ) + return "gcp"; + if ( + hasAny( + "AZURE_FUNCTION_NAME", + "FUNCTIONS_WORKER_RUNTIME", + "WEBSITE_INSTANCE_ID", + "WEBSITE_SITE_NAME", + ) + ) + return "azure"; + if (hasAny("DENO_DEPLOYMENT_ID", "DENO_REGION")) return "deno-deploy"; + if (hasAny("FLY_APP_NAME", "FLY_REGION", "FLY_ALLOC_ID")) return "fly-io"; + if (hasAny("RAILWAY_STATIC_URL", "RAILWAY_ENVIRONMENT_NAME")) + return "railway"; + if (hasAny("DYNO", "HEROKU_APP_NAME")) return "heroku"; + if (hasAny("DO_DEPLOYMENT_ID", "DO_APP_NAME", "DIGITALOCEAN")) + return "digitalocean"; + if (hasAny("KOYEB", "KOYEB_DEPLOYMENT_ID", "KOYEB_APP_NAME")) return "koyeb"; + return null; +} + +let isDockerCached: boolean | undefined; + +async function hasDockerEnv() { + try { + fs.statSync("/.dockerenv"); + return true; + } catch { + return false; + } +} + +async function hasDockerCGroup() { + try { + return fs.readFileSync("/proc/self/cgroup", "utf8").includes("docker"); + } catch { + return false; + } +} + +async function isDocker() { + if (isDockerCached === undefined) { + isDockerCached = (await hasDockerEnv()) || (await hasDockerCGroup()); + } + return isDockerCached; +} + +let isInsideContainerCached: boolean | undefined; + +const hasContainerEnv = async () => { + try { + fs.statSync("/run/.containerenv"); + return true; + } catch { + return false; + } +}; + +async function isInsideContainer() { + if (isInsideContainerCached === undefined) { + isInsideContainerCached = (await hasContainerEnv()) || (await isDocker()); + } + return isInsideContainerCached; +} + +async function isWsl() { + try { + if (process.platform !== "linux") { + return false; + } + if (os.release().toLowerCase().includes("microsoft")) { + if (await isInsideContainer()) { + return false; + } + return true; + } + + return fs + .readFileSync("/proc/version", "utf8") + .toLowerCase() + .includes("microsoft") + ? !(await isInsideContainer()) + : false; + } catch { + return false; + } +} + +// --- Node-specific: project ID --- + +let projectIdCached: string | null = null; + +async function getProjectId(baseUrl: string | undefined): Promise { + if (projectIdCached) return projectIdCached; + + const projectName = await getNameFromLocalPackageJson(); + if (projectName) { + projectIdCached = await hashToBase64( + baseUrl ? baseUrl + projectName : projectName, + ); + return projectIdCached; + } + + if (baseUrl) { + projectIdCached = await hashToBase64(baseUrl); + return projectIdCached; + } + + projectIdCached = generateId(32); + return projectIdCached; +} + +// --- detectDatabase/detectFramework override using local package.json reading --- + +async function detectDatabaseNode() { + const DATABASES: Record = { + pg: "postgresql", + mysql: "mysql", + mariadb: "mariadb", + sqlite3: "sqlite", + "better-sqlite3": "sqlite", + "@prisma/client": "prisma", + mongoose: "mongodb", + mongodb: "mongodb", + "drizzle-orm": "drizzle", + }; + for (const [pkg, name] of Object.entries(DATABASES)) { + const version = await getPackageVersion(pkg); + if (version) return { name, version }; + } + return undefined; +} + +async function detectFrameworkNode() { + const FRAMEWORKS: Record = { + next: "next", + nuxt: "nuxt", + "react-router": "react-router", + astro: "astro", + "@sveltejs/kit": "sveltekit", + "solid-start": "solid-start", + "tanstack-start": "tanstack-start", + hono: "hono", + express: "express", + elysia: "elysia", + expo: "expo", + }; + for (const [pkg, name] of Object.entries(FRAMEWORKS)) { + const version = await getPackageVersion(pkg); + if (version) return { name, version }; + } + return undefined; +} + +// --- Main telemetry export (node version) --- + +const noop: (event: TelemetryEvent) => Promise = async function noop() {}; + +export async function createTelemetry( + options: BetterAuthOptions, + context?: TelemetryContext | undefined, +) { + const debugEnabled = + options.telemetry?.debug || + getBooleanEnvVar("BETTER_AUTH_TELEMETRY_DEBUG", false); + + const telemetryEndpoint = ENV.BETTER_AUTH_TELEMETRY_ENDPOINT; + if (!telemetryEndpoint && !context?.customTrack) { + return { + publish: noop, + }; + } + const track = async (event: TelemetryEvent) => { + if (context?.customTrack) { + await context.customTrack(event).catch(logger.error); + } else if (telemetryEndpoint) { + if (debugEnabled) { + logger.info("telemetry event", JSON.stringify(event, null, 2)); + } else { + await betterFetch(telemetryEndpoint, { + method: "POST", + body: event, + }).catch(logger.error); + } + } + }; + + const isEnabled = async () => { + const telemetryEnabled = + options.telemetry?.enabled !== undefined + ? options.telemetry.enabled + : false; + const envEnabled = getBooleanEnvVar("BETTER_AUTH_TELEMETRY", false); + return ( + (envEnabled || telemetryEnabled) && (context?.skipTestCheck || !isTest()) + ); + }; + + const enabled = await isEnabled(); + let anonymousId: string | undefined; + + if (enabled) { + anonymousId = await getProjectId( + typeof options.baseURL === "string" ? options.baseURL : undefined, + ); + + const payload = { + config: await getTelemetryAuthConfig(options, context), + runtime: detectRuntime(), + database: await detectDatabaseNode(), + framework: await detectFrameworkNode(), + environment: detectEnvironment(), + systemInfo: await detectSystemInfo(), + packageManager: detectPackageManager(), + }; + + void track({ type: "init", payload, anonymousId }); + } + + return { + publish: async (event: TelemetryEvent) => { + if (!enabled) return; + if (!anonymousId) { + anonymousId = await getProjectId( + typeof options.baseURL === "string" ? options.baseURL : undefined, + ); + } + await track({ + type: event.type, + payload: event.payload, + anonymousId, + }); + }, + }; +} diff --git a/packages/telemetry/src/utils/import-util.ts b/packages/telemetry/src/utils/import-util.ts deleted file mode 100644 index 2fe75f55073..00000000000 --- a/packages/telemetry/src/utils/import-util.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const importRuntime = (m: string): Promise => { - return (Function("mm", "return import(mm)") as any)(m); -}; diff --git a/packages/telemetry/src/utils/package-json.ts b/packages/telemetry/src/utils/package-json.ts index 51791be8449..594b9451815 100644 --- a/packages/telemetry/src/utils/package-json.ts +++ b/packages/telemetry/src/utils/package-json.ts @@ -1,75 +1,15 @@ -import type { PackageJson } from "type-fest"; +// In the default (non-node) build, filesystem access is not available. +// The node build (src/node.ts) provides its own inline implementation +// using static top-level imports of node:fs/promises and node:path. -let packageJSONCache: PackageJson | undefined; - -async function readRootPackageJson() { - if (packageJSONCache) return packageJSONCache; - try { - const cwd = - typeof process !== "undefined" && typeof process.cwd === "function" - ? process.cwd() - : ""; - if (!cwd) return undefined; - // Lazily import Node built-ins only when available (Node/Bun/Deno) and - // avoid static analyzer/bundler resolution by obfuscating module names - const importRuntime = (m: string) => - (Function("mm", "return import(mm)") as any)(m); - const [{ default: fs }, { default: path }] = await Promise.all([ - importRuntime("fs/promises"), - importRuntime("path"), - ]); - const raw = await fs.readFile(path.join(cwd, "package.json"), "utf-8"); - packageJSONCache = JSON.parse(raw); - return packageJSONCache as PackageJson; - } catch {} +export async function getPackageVersion( + _pkg: string, +): Promise { return undefined; } -export async function getPackageVersion(pkg: string) { - if (packageJSONCache) { - return (packageJSONCache.dependencies?.[pkg] || - packageJSONCache.devDependencies?.[pkg] || - packageJSONCache.peerDependencies?.[pkg]) as string | undefined; - } - - try { - const cwd = - typeof process !== "undefined" && typeof process.cwd === "function" - ? process.cwd() - : ""; - if (!cwd) throw new Error("no-cwd"); - const importRuntime = (m: string) => - (Function("mm", "return import(mm)") as any)(m); - const [{ default: fs }, { default: path }] = await Promise.all([ - importRuntime("fs/promises"), - importRuntime("path"), - ]); - const pkgJsonPath = path.join(cwd, "node_modules", pkg, "package.json"); - const raw = await fs.readFile(pkgJsonPath, "utf-8"); - const json = JSON.parse(raw); - const resolved = - (json.version as string) || - (await getVersionFromLocalPackageJson(pkg)) || - undefined; - return resolved; - } catch {} - - const fromRoot = await getVersionFromLocalPackageJson(pkg); - return fromRoot; -} - -async function getVersionFromLocalPackageJson(pkg: string) { - const json = await readRootPackageJson(); - if (!json) return undefined; - const allDeps = { - ...json.dependencies, - ...json.devDependencies, - ...json.peerDependencies, - } as Record; - return allDeps[pkg]; -} - -export async function getNameFromLocalPackageJson() { - const json = await readRootPackageJson(); - return json?.name as string | undefined; +export async function getNameFromLocalPackageJson(): Promise< + string | undefined +> { + return undefined; } diff --git a/packages/telemetry/tsdown.config.ts b/packages/telemetry/tsdown.config.ts index d100d00ed5a..ef780f9c8a8 100644 --- a/packages/telemetry/tsdown.config.ts +++ b/packages/telemetry/tsdown.config.ts @@ -1,8 +1,16 @@ import { defineConfig } from "tsdown"; -export default defineConfig({ - dts: { build: true, incremental: true }, - format: ["esm"], - entry: ["./src/index.ts"], - sourcemap: true, -}); +export default defineConfig([ + { + dts: { build: true, incremental: true }, + format: ["esm"], + entry: ["./src/index.ts"], + sourcemap: true, + }, + { + dts: { build: true, incremental: true }, + format: ["esm"], + entry: ["./src/node.ts"], + sourcemap: true, + }, +]); From 2bd994babceb4ffd394c31acf0b60daa1e1dd335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A9l=20Solano?= Date: Mon, 9 Mar 2026 05:50:31 +0100 Subject: [PATCH 04/88] fix: preserve custom session fields on focus refresh (#8354) --- .../src/client/session-refresh.test.ts | 103 ++++++++++++++++++ .../better-auth/src/client/session-refresh.ts | 33 +++--- 2 files changed, 123 insertions(+), 13 deletions(-) diff --git a/packages/better-auth/src/client/session-refresh.test.ts b/packages/better-auth/src/client/session-refresh.test.ts index 8a4a44f56ef..8c78d0d880a 100644 --- a/packages/better-auth/src/client/session-refresh.test.ts +++ b/packages/better-auth/src/client/session-refresh.test.ts @@ -622,6 +622,109 @@ describe("session-refresh", () => { vi.useRealTimers(); }); + /** + * https://github.com/better-auth/better-auth/issues/8325 + */ + it("should preserve custom session fields on poll refresh", async () => { + vi.useFakeTimers(); + + const sessionAtom: SessionAtom = atom({ + data: { + user: { id: "1", email: "test@test.com" }, + session: { id: "session-1" }, + }, + error: null, + isPending: false, + }); + const sessionSignal = atom(false); + + const customSessionData = { + user: { id: "1", email: "test@test.com" }, + session: { id: "session-1" }, + activationInfo: { isActivated: true, activatedAt: "2024-01-01" }, + role: "admin", + }; + + const mockFetch = vi.fn(async () => ({ + data: customSessionData, + error: null, + })); + + const manager = createSessionRefreshManager({ + sessionAtom, + sessionSignal, + $fetch: mockFetch as any, + options: { + sessionOptions: { + refetchInterval: 5, + }, + }, + }); + + manager.init(); + + await vi.advanceTimersByTimeAsync(5000); + + const updatedSession = sessionAtom.get(); + expect(updatedSession.data).toEqual(customSessionData); + expect((updatedSession.data as any)?.activationInfo).toEqual({ + isActivated: true, + activatedAt: "2024-01-01", + }); + expect((updatedSession.data as any)?.role).toBe("admin"); + + manager.cleanup(); + vi.useRealTimers(); + }); + + it("should preserve custom session fields on visibilitychange refresh", async () => { + vi.useFakeTimers(); + + const sessionAtom: SessionAtom = atom({ + data: { + user: { id: "1", email: "test@test.com" }, + session: { id: "session-1" }, + }, + error: null, + isPending: false, + }); + const sessionSignal = atom(false); + + const customSessionData = { + user: { id: "1", email: "test@test.com" }, + session: { id: "session-1" }, + customField: "custom value", + }; + + const mockFetch = vi.fn(async () => ({ + data: customSessionData, + error: null, + })); + + const manager = createSessionRefreshManager({ + sessionAtom, + sessionSignal, + $fetch: mockFetch as any, + options: { + sessionOptions: { + refetchOnWindowFocus: true, + }, + }, + }); + + manager.init(); + + manager.triggerRefetch({ event: "visibilitychange" }); + await vi.runAllTimersAsync(); + + const updatedSession = sessionAtom.get(); + expect(updatedSession.data).toEqual(customSessionData); + expect((updatedSession.data as any)?.customField).toBe("custom value"); + + manager.cleanup(); + vi.useRealTimers(); + }); + it("should broadcast session update when broadcastSessionUpdate is called with signout", () => { const channel = getGlobalBroadcastChannel(); const postSpy = vi.spyOn(channel, "post"); diff --git a/packages/better-auth/src/client/session-refresh.ts b/packages/better-auth/src/client/session-refresh.ts index 8383d8220e4..a4c117c6ff4 100644 --- a/packages/better-auth/src/client/session-refresh.ts +++ b/packages/better-auth/src/client/session-refresh.ts @@ -15,10 +15,12 @@ const now = () => Math.floor(Date.now() / 1000); const FOCUS_REFETCH_RATE_LIMIT_SECONDS = 5; export interface SessionRefreshOptions { - sessionAtom: AuthQueryAtom<{ - user: User; - session: Session; - }>; + sessionAtom: AuthQueryAtom< + { + user: User; + session: Session; + } & Record + >; sessionSignal: WritableAtom; $fetch: BetterFetch; options?: BetterAuthClientOptions | undefined; @@ -34,11 +36,19 @@ interface SessionRefreshState { unsubscribeOnline?: (() => void) | undefined; } -interface SessionResponse { - session: Session | null; - user: User | null; - needsRefresh?: boolean; -} +export type SessionResponse = ( + | { + session: null; + user: null; + needsRefresh?: boolean; + } + | { + session: Session; + user: User; + needsRefresh?: boolean; + } +) & + Record; export function createSessionRefreshManager(opts: SessionRefreshOptions) { const { sessionAtom, sessionSignal, $fetch, options = {} } = opts; @@ -93,10 +103,7 @@ export function createSessionRefreshManager(opts: SessionRefreshOptions) { } catch {} } - const sessionData = - data?.session && data?.user - ? { session: data.session, user: data.user } - : null; + const sessionData = data?.session && data?.user ? data : null; sessionAtom.set({ ...currentSession, From b6222b2f9f00f898d725dcf4d8160526157c1911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A9l=20Solano?= Date: Mon, 9 Mar 2026 19:05:55 +0100 Subject: [PATCH 05/88] chore(client): re-export necessary types (#8497) --- packages/better-auth/src/client/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/better-auth/src/client/index.ts b/packages/better-auth/src/client/index.ts index c5c72f7aed3..13b34c31a82 100644 --- a/packages/better-auth/src/client/index.ts +++ b/packages/better-auth/src/client/index.ts @@ -41,4 +41,5 @@ export type * from "../plugins/access"; export type * from "../plugins/organization"; export type * from "../types/helper"; export type { UnionToIntersection } from "../types/helper"; +export type * from "./path-to-object"; //#endregion From 5003d946738f6aaba2669e3ec4dc9e9c61d078a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A9l=20Solano?= Date: Mon, 9 Mar 2026 19:09:28 +0100 Subject: [PATCH 06/88] chore: replace deprecated build configs (#8498) --- packages/api-key/tsdown.config.ts | 4 +++- packages/core/tsdown.config.ts | 4 +++- packages/electron/tsdown.config.ts | 29 ++++++++++++++++-------- packages/expo/tsdown.config.ts | 20 ++++++++-------- packages/i18n/tsdown.config.ts | 4 +++- packages/oauth-provider/tsdown.config.ts | 16 +++++++------ packages/passkey/tsdown.config.ts | 18 ++++++++------- packages/stripe/tsdown.config.ts | 9 +++++++- 8 files changed, 66 insertions(+), 38 deletions(-) diff --git a/packages/api-key/tsdown.config.ts b/packages/api-key/tsdown.config.ts index f2df8a0328a..833f634376b 100644 --- a/packages/api-key/tsdown.config.ts +++ b/packages/api-key/tsdown.config.ts @@ -4,7 +4,9 @@ export default defineConfig({ dts: { build: true, incremental: true }, format: ["esm"], entry: ["./src/index.ts", "./src/client.ts", "./src/types.ts"], - external: ["better-auth", "better-call", "@better-fetch/fetch"], + deps: { + neverBundle: ["better-auth", "better-call", "@better-fetch/fetch"], + }, sourcemap: true, treeshake: true, }); diff --git a/packages/core/tsdown.config.ts b/packages/core/tsdown.config.ts index 97821f1e5a3..928b78eccf6 100644 --- a/packages/core/tsdown.config.ts +++ b/packages/core/tsdown.config.ts @@ -23,7 +23,9 @@ export default defineConfig({ "!./src/utils/*.test.ts", "./src/error/index.ts", ], - external: ["@better-auth/core/async_hooks"], + deps: { + neverBundle: ["@better-auth/core/async_hooks"], + }, env: { BETTER_AUTH_VERSION: packageJson.version, BETTER_AUTH_TELEMETRY_ENDPOINT: diff --git a/packages/electron/tsdown.config.ts b/packages/electron/tsdown.config.ts index 42dc3fd1dbe..607eb3e1bbd 100644 --- a/packages/electron/tsdown.config.ts +++ b/packages/electron/tsdown.config.ts @@ -10,23 +10,32 @@ export default defineConfig([ "./src/proxy.ts", "./src/storage.ts", ], - external: ["better-auth", "better-call", "@better-fetch/fetch", "electron"], + deps: { + neverBundle: [ + "better-auth", + "better-call", + "@better-fetch/fetch", + "electron", + ], + }, treeshake: true, }, { dts: { build: true, incremental: true }, format: ["esm"], entry: ["./src/preload.ts"], - external: (id, _, isResolved) => { - if (isResolved) return false; - return ( - !id.startsWith(".") && - !id.startsWith("better-call") && - !id.startsWith("@better-auth/core") - ); + deps: { + neverBundle: (id, _, isResolved) => { + if (isResolved) return false; + return ( + !id.startsWith(".") && + !id.startsWith("better-call") && + !id.startsWith("@better-auth/core") + ); + }, + alwaysBundle: [/^@better-auth\/core/, /^better-call/], + onlyAllowBundle: ["better-call", "@standard-schema/spec"], }, - noExternal: [/^@better-auth\/core/, /^better-call/], - inlineOnly: ["better-call", "@standard-schema/spec"], treeshake: true, }, ]); diff --git a/packages/expo/tsdown.config.ts b/packages/expo/tsdown.config.ts index a44883fa000..9c9d726884e 100644 --- a/packages/expo/tsdown.config.ts +++ b/packages/expo/tsdown.config.ts @@ -4,15 +4,17 @@ export default defineConfig({ dts: { build: true, incremental: true }, format: ["esm"], entry: ["./src/index.ts", "./src/client.ts", "./src/plugins/index.ts"], - external: [ - "better-auth", - "better-call", - "@better-fetch/fetch", - "react-native", - "expo-web-browser", - "expo-linking", - "expo-constants", - ], + deps: { + neverBundle: [ + "better-auth", + "better-call", + "@better-fetch/fetch", + "react-native", + "expo-web-browser", + "expo-linking", + "expo-constants", + ], + }, platform: "neutral", sourcemap: true, treeshake: true, diff --git a/packages/i18n/tsdown.config.ts b/packages/i18n/tsdown.config.ts index e254acf9196..cc70b8cdddd 100644 --- a/packages/i18n/tsdown.config.ts +++ b/packages/i18n/tsdown.config.ts @@ -4,7 +4,9 @@ export default defineConfig({ dts: { build: true, incremental: true }, format: ["esm"], entry: ["./src/index.ts", "./src/client.ts"], - external: ["@better-auth/core", "better-auth"], + deps: { + neverBundle: ["@better-auth/core", "better-auth"], + }, sourcemap: true, treeshake: true, }); diff --git a/packages/oauth-provider/tsdown.config.ts b/packages/oauth-provider/tsdown.config.ts index 1e3b6255df5..a658e1f1ee7 100644 --- a/packages/oauth-provider/tsdown.config.ts +++ b/packages/oauth-provider/tsdown.config.ts @@ -4,13 +4,15 @@ export default defineConfig({ dts: { build: true, incremental: true }, format: ["esm"], entry: ["./src/index.ts", "./src/client.ts", "./src/client-resource.ts"], - external: [ - "@better-auth/core", - "@better-auth/utils", - "@better-fetch/fetch", - "better-auth", - "better-call", - ], + deps: { + neverBundle: [ + "@better-auth/core", + "@better-auth/utils", + "@better-fetch/fetch", + "better-auth", + "better-call", + ], + }, sourcemap: true, treeshake: true, clean: true, diff --git a/packages/passkey/tsdown.config.ts b/packages/passkey/tsdown.config.ts index 97122ea4b96..4e3ef1b566e 100644 --- a/packages/passkey/tsdown.config.ts +++ b/packages/passkey/tsdown.config.ts @@ -4,14 +4,16 @@ export default defineConfig({ dts: { build: true, incremental: true }, format: ["esm"], entry: ["./src/index.ts", "./src/client.ts"], - external: [ - "nanostores", - "@better-auth/utils", - "better-call", - "@better-fetch/fetch", - "@better-auth/core", - "better-auth", - ], + deps: { + neverBundle: [ + "nanostores", + "@better-auth/utils", + "better-call", + "@better-fetch/fetch", + "@better-auth/core", + "better-auth", + ], + }, sourcemap: true, treeshake: true, }); diff --git a/packages/stripe/tsdown.config.ts b/packages/stripe/tsdown.config.ts index 87ee90a250b..6db760ce45f 100644 --- a/packages/stripe/tsdown.config.ts +++ b/packages/stripe/tsdown.config.ts @@ -4,6 +4,13 @@ export default defineConfig({ dts: { build: true, incremental: true }, format: ["esm"], entry: ["./src/index.ts", "./src/client.ts"], - external: ["better-auth", "better-call", "@better-fetch/fetch", "stripe"], + deps: { + neverBundle: [ + "better-auth", + "better-call", + "@better-fetch/fetch", + "stripe", + ], + }, sourcemap: true, }); From e3e6664d7b4773b424568ba67a616e73f552d963 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Mon, 9 Mar 2026 10:18:21 -0700 Subject: [PATCH 07/88] fix: throw on duplicate email when `autoSignIn: false` without `requireEmailVerification` (#8521) --- .../src/api/routes/sign-up.test.ts | 60 +++++++++++++++++-- .../better-auth/src/api/routes/sign-up.ts | 6 +- 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/packages/better-auth/src/api/routes/sign-up.test.ts b/packages/better-auth/src/api/routes/sign-up.test.ts index 09d856bbad8..44f0a545ae8 100644 --- a/packages/better-auth/src/api/routes/sign-up.test.ts +++ b/packages/better-auth/src/api/routes/sign-up.test.ts @@ -265,13 +265,14 @@ describe("sign-up user enumeration protection", async () => { ); }); - it("should call onExistingUserSignUp when autoSignIn is false", async () => { + it("should call onExistingUserSignUp when autoSignIn is false and requireEmailVerification is true", async () => { const onExistingUserSignUp = vi.fn(); const { auth } = await getTestInstance( { emailAndPassword: { enabled: true, autoSignIn: false, + requireEmailVerification: true, onExistingUserSignUp, }, }, @@ -292,6 +293,33 @@ describe("sign-up user enumeration protection", async () => { expect(onExistingUserSignUp).toHaveBeenCalledTimes(1); }); + it("should not call onExistingUserSignUp when autoSignIn is false without requireEmailVerification", async () => { + const onExistingUserSignUp = vi.fn(); + const { auth } = await getTestInstance( + { + emailAndPassword: { + enabled: true, + autoSignIn: false, + onExistingUserSignUp, + }, + }, + { + disableTestUser: true, + }, + ); + + const body = { + email: "callback-autosignin-no-verify@test.com", + password: "password123", + name: "Callback AutoSignIn No Verify", + }; + + await auth.api.signUpEmail({ body }); + await expect(auth.api.signUpEmail({ body })).rejects.toThrow(); + + expect(onExistingUserSignUp).not.toHaveBeenCalled(); + }); + it("should not call onExistingUserSignUp when enumeration protection is inactive", async () => { const onExistingUserSignUp = vi.fn(); const { auth } = await getTestInstance( @@ -344,7 +372,7 @@ describe("sign-up user enumeration protection", async () => { expect(onExistingUserSignUp).not.toHaveBeenCalled(); }); - it("should return success for existing email when autoSignIn is disabled", async () => { + it("should throw for existing email when autoSignIn is disabled without requireEmailVerification", async () => { const { auth } = await getTestInstance( { emailAndPassword: { @@ -365,10 +393,32 @@ describe("sign-up user enumeration protection", async () => { await auth.api.signUpEmail({ body }); - const duplicatedSignUp = await auth.api.signUpEmail({ body }); + await expect(auth.api.signUpEmail({ body })).rejects.toThrow(); + }); - expect(duplicatedSignUp.token).toBeNull(); - expect(duplicatedSignUp.user.email).toBe(body.email); + it("should return token: null for new sign-up when autoSignIn is disabled", async () => { + const { auth } = await getTestInstance( + { + emailAndPassword: { + enabled: true, + autoSignIn: false, + }, + }, + { + disableTestUser: true, + }, + ); + + const res = await auth.api.signUpEmail({ + body: { + email: "new-auto-signin@test.com", + password: "password123", + name: "New User", + }, + }); + + expect(res.token).toBeNull(); + expect(res.user.email).toBe("new-auto-signin@test.com"); }); }); diff --git a/packages/better-auth/src/api/routes/sign-up.ts b/packages/better-auth/src/api/routes/sign-up.ts index 15f340edd95..5bf210714d4 100644 --- a/packages/better-auth/src/api/routes/sign-up.ts +++ b/packages/better-auth/src/api/routes/sign-up.ts @@ -232,8 +232,10 @@ export const signUpEmail = () => ); } const shouldReturnGenericDuplicateResponse = - ctx.context.options.emailAndPassword.autoSignIn === false || ctx.context.options.emailAndPassword.requireEmailVerification; + const shouldSkipAutoSignIn = + ctx.context.options.emailAndPassword.autoSignIn === false || + shouldReturnGenericDuplicateResponse; const additionalUserFields = parseUserInput( ctx.context.options, rest, @@ -391,7 +393,7 @@ export const signUpEmail = () => } } - if (shouldReturnGenericDuplicateResponse) { + if (shouldSkipAutoSignIn) { return ctx.json({ token: null, user: parseUserOutput(ctx.context.options, createdUser) as User< From 11ef01a56e26f2a543959f5bd285736ec128ca54 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Mon, 9 Mar 2026 11:03:46 -0700 Subject: [PATCH 08/88] fix(cli): resolve path aliases from extended tsconfig files (#8520) --- knip.jsonc | 1 + packages/cli/package.json | 1 + packages/cli/src/utils/get-config.ts | 144 +++++++------ packages/cli/src/utils/get-tsconfig-info.ts | 27 --- packages/cli/test/get-config.test.ts | 213 ++++++++++++++++++++ pnpm-lock.yaml | 29 +-- 6 files changed, 309 insertions(+), 106 deletions(-) delete mode 100644 packages/cli/src/utils/get-tsconfig-info.ts diff --git a/knip.jsonc b/knip.jsonc index b37136c3d9c..755085773ba 100644 --- a/knip.jsonc +++ b/knip.jsonc @@ -86,6 +86,7 @@ "better-auth", "c12", "chalk", + "get-tsconfig", "open", "prettier", "prompts", diff --git a/packages/cli/package.json b/packages/cli/package.json index d3b6d183307..cc88370bc9b 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -69,6 +69,7 @@ "commander": "^12.1.0", "dotenv": "^17.3.1", "drizzle-orm": "^0.41.0", + "get-tsconfig": "^4.13.6", "open": "^10.2.0", "pg": "^8.19.0", "prettier": "^3.8.1", diff --git a/packages/cli/src/utils/get-config.ts b/packages/cli/src/utils/get-config.ts index 91f8a3142db..0fc96a6e6d6 100644 --- a/packages/cli/src/utils/get-config.ts +++ b/packages/cli/src/utils/get-config.ts @@ -7,10 +7,11 @@ import babelPresetTypeScript from "@babel/preset-typescript"; import type { BetterAuthOptions } from "@better-auth/core"; import { BetterAuthError } from "@better-auth/core/error"; import { loadConfig } from "c12"; +import type { TsConfigResult } from "get-tsconfig"; +import { getTsconfig, parseTsconfig } from "get-tsconfig"; import type { JitiOptions } from "jiti"; import { addCloudflareModules } from "./add-cloudflare-modules"; import { addSvelteKitEnvModules } from "./add-svelte-kit-env-modules"; -import { getTsconfigInfo } from "./get-tsconfig-info"; let possiblePaths = [ "auth.ts", @@ -42,93 +43,104 @@ possiblePaths = [ ...possiblePaths.map((it) => `app/${it}`), ]; -function resolveReferencePath(configDir: string, refPath: string): string { - const resolvedPath = path.resolve(configDir, refPath); - - // If it ends with .json, treat as direct file reference - if (refPath.endsWith(".json")) { - return resolvedPath; +function mergeAliases( + target: Record, + source: Record, +): void { + for (const [alias, aliasPath] of Object.entries(source)) { + if (!(alias in target)) { + target[alias] = aliasPath; + } } +} - // If the exact path exists and is a file, use it - if (fs.existsSync(resolvedPath)) { - try { - const stats = fs.statSync(resolvedPath); - if (stats.isFile()) { - return resolvedPath; - } - } catch { - // Fall through to directory handling +function extractAliases(tsconfig: TsConfigResult): Record { + const { paths = {}, baseUrl } = tsconfig.config.compilerOptions ?? {}; + const result: Record = {}; + const configDir = path.dirname(tsconfig.path); + const resolvedBaseUrl = baseUrl + ? path.resolve(configDir, baseUrl) + : configDir; + + for (const [alias, aliasPaths = []] of Object.entries(paths)) { + for (const aliasedPath of aliasPaths) { + const finalAlias = alias.slice(-1) === "*" ? alias.slice(0, -1) : alias; + const finalAliasedPath = + aliasedPath.slice(-1) === "*" ? aliasedPath.slice(0, -1) : aliasedPath; + + result[finalAlias || ""] = path.join(resolvedBaseUrl, finalAliasedPath); } } + return result; +} - // Otherwise, assume directory reference - return path.resolve(configDir, refPath, "tsconfig.json"); +/** + * Reads raw tsconfig JSON to get `references` (which get-tsconfig strips out). + */ +function readRawTsconfigReferences( + tsconfigPath: string, +): Array<{ path: string }> | undefined { + try { + const text = fs.readFileSync(tsconfigPath, "utf-8"); + const stripped = text + .replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (m, g) => + g ? "" : m, + ) + .replace(/,(?=\s*[}\]])/g, ""); + const raw = JSON.parse(stripped); + return raw.references; + } catch { + return undefined; + } } -function getPathAliasesRecursive( +/** + * Collect path aliases from tsconfig references recursively. + */ +function collectReferencesAliases( tsconfigPath: string, visited = new Set(), ): Record { - if (visited.has(tsconfigPath)) { - return {}; - } - visited.add(tsconfigPath); - - if (!fs.existsSync(tsconfigPath)) { - console.warn(`Referenced tsconfig not found: ${tsconfigPath}`); - return {}; - } - - try { - const tsConfig = getTsconfigInfo(undefined, tsconfigPath); - const { paths = {}, baseUrl = "." } = tsConfig.compilerOptions || {}; - const result: Record = {}; + const result: Record = {}; + const refs = readRawTsconfigReferences(tsconfigPath); + if (!refs) return result; - const configDir = path.dirname(tsconfigPath); - const obj = Object.entries(paths) as [string, string[]][]; - for (const [alias, aliasPaths] of obj) { - for (const aliasedPath of aliasPaths) { - const resolvedBaseUrl = path.resolve(configDir, baseUrl); - const finalAlias = alias.slice(-1) === "*" ? alias.slice(0, -1) : alias; - const finalAliasedPath = - aliasedPath.slice(-1) === "*" - ? aliasedPath.slice(0, -1) - : aliasedPath; + const configDir = path.dirname(tsconfigPath); + for (const ref of refs) { + const resolvedRef = path.resolve(configDir, ref.path); + const refTsconfigPath = resolvedRef.endsWith(".json") + ? resolvedRef + : path.join(resolvedRef, "tsconfig.json"); - result[finalAlias || ""] = path.join(resolvedBaseUrl, finalAliasedPath); - } - } + if (visited.has(refTsconfigPath)) continue; + visited.add(refTsconfigPath); - if (tsConfig.references) { - for (const ref of tsConfig.references) { - const refPath = resolveReferencePath(configDir, ref.path); - const refAliases = getPathAliasesRecursive(refPath, visited); - for (const [alias, aliasPath] of Object.entries(refAliases)) { - if (!(alias in result)) { - result[alias] = aliasPath; - } - } - } + try { + const refConfig = parseTsconfig(refTsconfigPath); + mergeAliases( + result, + extractAliases({ path: refTsconfigPath, config: refConfig }), + ); + } catch { + continue; } - return result; - } catch (error) { - console.warn(`Error parsing tsconfig at ${tsconfigPath}: ${error}`); - return {}; + mergeAliases(result, collectReferencesAliases(refTsconfigPath, visited)); } + return result; } function getPathAliases(cwd: string): Record | null { - let tsConfigPath = path.join(cwd, "tsconfig.json"); - if (!fs.existsSync(tsConfigPath)) { - tsConfigPath = path.join(cwd, "jsconfig.json"); - } - if (!fs.existsSync(tsConfigPath)) { + const configName = fs.existsSync(path.join(cwd, "tsconfig.json")) + ? "tsconfig.json" + : "jsconfig.json"; + const tsconfig = getTsconfig(cwd, configName); + if (!tsconfig) { return null; } try { - const result = getPathAliasesRecursive(tsConfigPath); + const result = extractAliases(tsconfig); + mergeAliases(result, collectReferencesAliases(tsconfig.path)); addSvelteKitEnvModules(result); addCloudflareModules(result); return result; diff --git a/packages/cli/src/utils/get-tsconfig-info.ts b/packages/cli/src/utils/get-tsconfig-info.ts deleted file mode 100644 index c0e35c7ea46..00000000000 --- a/packages/cli/src/utils/get-tsconfig-info.ts +++ /dev/null @@ -1,27 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; - -function stripJsonComments(jsonString: string): string { - return jsonString - .replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (m, g) => - g ? "" : m, - ) - .replace(/,(?=\s*[}\]])/g, ""); -} - -export function getTsconfigInfo(cwd?: string, flatPath?: string) { - let tsConfigPath: string; - if (flatPath) { - tsConfigPath = flatPath; - } else { - tsConfigPath = cwd - ? path.join(cwd, "tsconfig.json") - : path.join("tsconfig.json"); - } - try { - const text = fs.readFileSync(tsConfigPath, "utf-8"); - return JSON.parse(stripJsonComments(text)); - } catch (error) { - throw error; - } -} diff --git a/packages/cli/test/get-config.test.ts b/packages/cli/test/get-config.test.ts index f606aeaa0c3..b61657e523c 100644 --- a/packages/cli/test/get-config.test.ts +++ b/packages/cli/test/get-config.test.ts @@ -897,4 +897,217 @@ describe("getConfig", async () => { expect(config).not.toBe(null); expect(config?.emailAndPassword?.enabled).toBe(true); }); + + /** + * @see https://github.com/better-auth/better-auth/issues/6373 + */ + it("should resolve path aliases from extended tsconfig", async () => { + const authPath = path.join(tmpDir, "src", "auth"); + const dbPath = path.join(tmpDir, "src", "db"); + await fs.mkdir(authPath, { recursive: true }); + await fs.mkdir(dbPath, { recursive: true }); + + // Create base tsconfig with path aliases + await fs.writeFile( + path.join(tmpDir, "tsconfig.base.json"), + `{ + "compilerOptions": { + "paths": { + "@src/*": ["./src/*"] + } + } + }`, + ); + + // Create tsconfig.json that extends base + await fs.writeFile( + path.join(tmpDir, "tsconfig.json"), + `{ + "extends": "./tsconfig.base.json" + }`, + ); + + // Create dummy db.ts + await fs.writeFile( + path.join(dbPath, "db.ts"), + `class PrismaClient { + constructor() {} + } + export const db = new PrismaClient()`, + ); + + // Create auth.ts using the alias from extended config + await fs.writeFile( + path.join(authPath, "auth.ts"), + `import {betterAuth} from "better-auth"; + import {prismaAdapter} from "better-auth/adapters/prisma"; + import {db} from "@src/db/db"; + + export const auth = betterAuth({ + database: prismaAdapter(db, { + provider: 'sqlite' + }), + emailAndPassword: { + enabled: true, + } + })`, + ); + + const config = await getConfig({ + cwd: tmpDir, + configPath: "src/auth/auth.ts", + }); + + expect(config).not.toBe(null); + expect(config).toMatchObject({ + emailAndPassword: { enabled: true }, + }); + }); + + /** + * @see https://github.com/better-auth/better-auth/issues/6373 + */ + it("should resolve path aliases from chained extends", async () => { + const authPath = path.join(tmpDir, "src", "auth"); + const dbPath = path.join(tmpDir, "src", "db"); + await fs.mkdir(authPath, { recursive: true }); + await fs.mkdir(dbPath, { recursive: true }); + + // Create grandparent tsconfig with path aliases + await fs.writeFile( + path.join(tmpDir, "tsconfig.root.json"), + `{ + "compilerOptions": { + "paths": { + "@server/*": ["./src/*"] + } + } + }`, + ); + + // Create parent tsconfig that extends grandparent + await fs.writeFile( + path.join(tmpDir, "tsconfig.base.json"), + `{ + "extends": "./tsconfig.root.json" + }`, + ); + + // Create tsconfig.json that extends parent + await fs.writeFile( + path.join(tmpDir, "tsconfig.json"), + `{ + "extends": "./tsconfig.base.json" + }`, + ); + + // Create dummy db.ts + await fs.writeFile( + path.join(dbPath, "db.ts"), + `class PrismaClient { + constructor() {} + } + export const db = new PrismaClient()`, + ); + + // Create auth.ts using the alias from grandparent + await fs.writeFile( + path.join(authPath, "auth.ts"), + `import {betterAuth} from "better-auth"; + import {prismaAdapter} from "better-auth/adapters/prisma"; + import {db} from "@server/db/db"; + + export const auth = betterAuth({ + database: prismaAdapter(db, { + provider: 'sqlite' + }), + emailAndPassword: { + enabled: true, + } + })`, + ); + + const config = await getConfig({ + cwd: tmpDir, + configPath: "src/auth/auth.ts", + }); + + expect(config).not.toBe(null); + expect(config).toMatchObject({ + emailAndPassword: { enabled: true }, + }); + }); + + /** + * @see https://github.com/better-auth/better-auth/issues/6373 + */ + it("should let child paths override parent paths from extends", async () => { + const authPath = path.join(tmpDir, "server", "auth"); + const dbPath = path.join(tmpDir, "server", "db"); + const oldDbPath = path.join(tmpDir, "old", "db"); + await fs.mkdir(authPath, { recursive: true }); + await fs.mkdir(dbPath, { recursive: true }); + await fs.mkdir(oldDbPath, { recursive: true }); + + // Create parent tsconfig with path aliases pointing to old location + await fs.writeFile( + path.join(tmpDir, "tsconfig.base.json"), + `{ + "compilerOptions": { + "paths": { + "@server/*": ["./old/*"] + } + } + }`, + ); + + // Create child tsconfig that overrides the alias + await fs.writeFile( + path.join(tmpDir, "tsconfig.json"), + `{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "paths": { + "@server/*": ["./server/*"] + } + } + }`, + ); + + // Create dummy db.ts in the correct (overridden) location + await fs.writeFile( + path.join(dbPath, "db.ts"), + `class PrismaClient { + constructor() {} + } + export const db = new PrismaClient()`, + ); + + // Create auth.ts + await fs.writeFile( + path.join(authPath, "auth.ts"), + `import {betterAuth} from "better-auth"; + import {prismaAdapter} from "better-auth/adapters/prisma"; + import {db} from "@server/db/db"; + + export const auth = betterAuth({ + database: prismaAdapter(db, { + provider: 'sqlite' + }), + emailAndPassword: { + enabled: true, + } + })`, + ); + + const config = await getConfig({ + cwd: tmpDir, + configPath: "server/auth/auth.ts", + }); + + expect(config).not.toBe(null); + expect(config).toMatchObject({ + emailAndPassword: { enabled: true }, + }); + }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d546b25b1ce..e693b622973 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -441,7 +441,7 @@ importers: version: 0.30.6 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) mongodb: specifier: ^7.1.0 version: 7.1.0(socks@2.8.7) @@ -654,7 +654,7 @@ importers: version: link:../../../../../packages/better-auth drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) hono: specifier: ^4.12.3 version: 4.12.5 @@ -1049,7 +1049,7 @@ importers: version: 0.31.9 drizzle-orm: specifier: '>=0.41.0' - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) jose: specifier: ^6.1.3 version: 6.1.3 @@ -1206,7 +1206,10 @@ importers: version: 17.3.1 drizzle-orm: specifier: ^0.41.0 - version: 0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + get-tsconfig: + specifier: ^4.13.6 + version: 4.13.6 open: specifier: ^10.2.0 version: 10.2.0 @@ -1307,7 +1310,7 @@ importers: version: 0.3.1 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) tsdown: specifier: 'catalog:' version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) @@ -26852,7 +26855,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): + drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260226.1 '@electric-sql/pglite': 0.3.15 @@ -26888,13 +26891,13 @@ snapshots: postgres: 3.4.8 prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): + drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260226.1 '@electric-sql/pglite': 0.3.15 '@libsql/client': 0.17.0(encoding@0.1.13) '@opentelemetry/api': 1.9.0 - '@prisma/client': 7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) + '@prisma/client': 7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) '@types/better-sqlite3': 7.6.13 '@types/pg': 8.16.0 better-sqlite3: 12.6.2 @@ -26904,16 +26907,15 @@ snapshots: mysql2: 3.18.2(@types/node@25.3.3) pg: 8.19.0 postgres: 3.4.8 - prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - optional: true + prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): + drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260226.1 '@electric-sql/pglite': 0.3.15 '@libsql/client': 0.17.0(encoding@0.1.13) '@opentelemetry/api': 1.9.0 - '@prisma/client': 7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) + '@prisma/client': 7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) '@types/better-sqlite3': 7.6.13 '@types/pg': 8.16.0 better-sqlite3: 12.6.2 @@ -26923,7 +26925,8 @@ snapshots: mysql2: 3.18.2(@types/node@25.3.3) pg: 8.19.0 postgres: 3.4.8 - prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + optional: true drizzle-zod@0.8.3(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.2))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(zod@4.3.6): dependencies: From 8e089edf4239198e76e8ae2ce29e248a5c791817 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Mon, 9 Mar 2026 12:33:26 -0700 Subject: [PATCH 09/88] chore: exclude worktrees from biome lint scope --- biome.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/biome.json b/biome.json index e1b79cd7c28..bdad724c540 100644 --- a/biome.json +++ b/biome.json @@ -145,7 +145,8 @@ "!**/playwright-report", "!**/.output", "!**/.tmp", - "!**/tmp-docs-fetch" + "!**/tmp-docs-fetch", + "!**/.claude/worktrees/**" ] } } From 857fbb3d94cb0ffc1cbe72972ad8c48397df05ec Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Mon, 9 Mar 2026 16:08:20 -0700 Subject: [PATCH 10/88] docs: add warning about localhost in trusted origins (#8527) --- docs/content/docs/reference/security.mdx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/content/docs/reference/security.mdx b/docs/content/docs/reference/security.mdx index f0901d63527..58444f979a7 100644 --- a/docs/content/docs/reference/security.mdx +++ b/docs/content/docs/reference/security.mdx @@ -200,7 +200,7 @@ Trusted origins prevent CSRF attacks and block open redirects. You can set a lis ### Basic Usage -The most basic usage is to specify exact origins: +The most basic usage is to specify exact origins, below is an example of a trusted origins configuration: ```typescript { @@ -211,6 +211,9 @@ The most basic usage is to specify exact origins: ] } ``` + + Do not leave the localhost origin in a trusted origins list of a production auth instance. + ### Wildcard Origins From 92722023dce0c8349a9674db6799b289c845e6ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A9l=20Solano?= Date: Tue, 10 Mar 2026 02:28:39 +0100 Subject: [PATCH 11/88] docs: fix enterprise contact form url (#8531) --- landing/app/enterprise/enterprise-client.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/landing/app/enterprise/enterprise-client.tsx b/landing/app/enterprise/enterprise-client.tsx index d4455726579..e9f2ec3c837 100644 --- a/landing/app/enterprise/enterprise-client.tsx +++ b/landing/app/enterprise/enterprise-client.tsx @@ -100,7 +100,7 @@ export function EnterprisePageClient() { const url = process.env.NODE_ENV === "development" ? "http://localhost:3001/api/enterprise/contact" - : "/api/enterprise/contact"; + : "https://dash.better-auth.com/api/enterprise/contact"; const response = await fetch(url, { method: "POST", body: JSON.stringify({ From d803657a6965df12a8ba1ebe33b06c7e75c7ddd1 Mon Sep 17 00:00:00 2001 From: Rudraksh Tripathi <62953974+Rudraksh88@users.noreply.github.com> Date: Tue, 10 Mar 2026 21:33:46 +0530 Subject: [PATCH 12/88] docs: sidebar navigation accordion text tracking (#8533) --- landing/components/docs/docs-sidebar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/landing/components/docs/docs-sidebar.tsx b/landing/components/docs/docs-sidebar.tsx index 835f035f9de..785fa7cbd85 100644 --- a/landing/components/docs/docs-sidebar.tsx +++ b/landing/components/docs/docs-sidebar.tsx @@ -115,7 +115,7 @@ export function DocsSidebar() { }} > - {section.title} + {section.title} Date: Mon, 9 Mar 2026 14:59:06 -0700 Subject: [PATCH 13/88] fix(prisma-adapter): fall back to updateMany for non-unique updates (#8524) --- .../prisma-adapter/src/prisma-adapter.test.ts | 103 +++++++++++++++++- packages/prisma-adapter/src/prisma-adapter.ts | 51 +++++++++ 2 files changed, 152 insertions(+), 2 deletions(-) diff --git a/packages/prisma-adapter/src/prisma-adapter.test.ts b/packages/prisma-adapter/src/prisma-adapter.test.ts index 9240dc3d0f5..75fa99ff801 100644 --- a/packages/prisma-adapter/src/prisma-adapter.test.ts +++ b/packages/prisma-adapter/src/prisma-adapter.test.ts @@ -1,14 +1,113 @@ +import type { BetterAuthOptions } from "@better-auth/core"; import { describe, expect, it, vi } from "vitest"; import { prismaAdapter } from "./prisma-adapter"; describe("prisma-adapter", () => { + const createTestAdapter = (prisma: Record) => + prismaAdapter(prisma as never, { + provider: "sqlite", + })({} as BetterAuthOptions); + it("should create prisma adapter", () => { const prisma = { $transaction: vi.fn(), - } as any; - const adapter = prismaAdapter(prisma, { + }; + const adapter = prismaAdapter(prisma as never, { provider: "sqlite", }); expect(adapter).toBeDefined(); }); + + /** + * @see https://github.com/better-auth/better-auth/issues/8365 + */ + it("should fall back to updateMany for non-unique verification identifiers", async () => { + const update = vi.fn(); + const updateMany = vi.fn().mockResolvedValue({ count: 1 }); + const findFirst = vi.fn().mockResolvedValue({ + id: "verification-id", + identifier: "magic-link-token", + value: "updated-value", + }); + const adapter = createTestAdapter({ + $transaction: vi.fn(), + verification: { + findFirst, + update, + updateMany, + }, + }); + + const result = await adapter.update({ + model: "verification", + where: [{ field: "identifier", value: "magic-link-token" }], + update: { value: "updated-value" }, + }); + + expect(update).not.toHaveBeenCalled(); + expect(updateMany).toHaveBeenCalledWith( + expect.objectContaining({ + where: { + identifier: "magic-link-token", + }, + data: expect.objectContaining({ + value: "updated-value", + updatedAt: expect.any(Date), + }), + }), + ); + expect(findFirst).toHaveBeenCalledWith({ + where: { + identifier: "magic-link-token", + }, + }); + expect(result).toEqual({ + id: "verification-id", + identifier: "magic-link-token", + value: "updated-value", + }); + }); + + it("should keep using update for unique non-id fields", async () => { + const update = vi.fn().mockResolvedValue({ + id: "session-id", + token: "session-token", + userId: "user-id", + }); + const updateMany = vi.fn(); + const findFirst = vi.fn(); + const adapter = createTestAdapter({ + $transaction: vi.fn(), + session: { + findFirst, + update, + updateMany, + }, + }); + + const result = await adapter.update({ + model: "session", + where: [{ field: "token", value: "session-token" }], + update: { userId: "user-id" }, + }); + + expect(update).toHaveBeenCalledWith( + expect.objectContaining({ + where: { + token: "session-token", + }, + data: expect.objectContaining({ + userId: "user-id", + updatedAt: expect.any(Date), + }), + }), + ); + expect(updateMany).not.toHaveBeenCalled(); + expect(findFirst).not.toHaveBeenCalled(); + expect(result).toEqual({ + id: "session-id", + token: "session-token", + userId: "user-id", + }); + }); }); diff --git a/packages/prisma-adapter/src/prisma-adapter.ts b/packages/prisma-adapter/src/prisma-adapter.ts index 2eb3673a50e..cbb0fdababe 100644 --- a/packages/prisma-adapter/src/prisma-adapter.ts +++ b/packages/prisma-adapter/src/prisma-adapter.ts @@ -183,6 +183,35 @@ export const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => { return operator; } } + const hasRootUniqueWhereCondition = ( + model: string, + where?: Where[] | undefined, + ) => { + if (!where?.length) { + return false; + } + + return where.some((condition) => { + if (condition.connector === "OR") { + return false; + } + + if (condition.operator && condition.operator !== "eq") { + return false; + } + + if (condition.field === "id") { + return true; + } + + return ( + getFieldAttributes({ + model, + field: condition.field, + })?.unique === true + ); + }); + }; const convertWhereClause = ({ action, model, @@ -463,6 +492,28 @@ export const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => { `Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`, ); } + const hasRootUniqueCondition = hasRootUniqueWhereCondition( + model, + where, + ); + if (!hasRootUniqueCondition) { + const whereClause = convertWhereClause({ + model, + where, + action: "updateMany", + }); + const result = await db[model]!.updateMany({ + where: whereClause, + data: update, + }); + if (!result?.count) { + return null; + } + + return await db[model]!.findFirst({ + where: whereClause, + }); + } const whereClause = convertWhereClause({ model, where, From c03666a5daf871532ba3d5dfd3950292dc004054 Mon Sep 17 00:00:00 2001 From: Gautam Manchandani Date: Tue, 10 Mar 2026 04:20:27 +0530 Subject: [PATCH 14/88] fix(oauth-provider): avoid fetch redirect CORS after login (#8519) --- .../src/plugins/oidc-provider/authorize.ts | 3 +- .../core/src/utils/fetch-metadata.test.ts | 28 ++++++++ packages/core/src/utils/fetch-metadata.ts | 3 + packages/oauth-provider/src/authorize.ts | 4 +- packages/oauth-provider/src/oauth.test.ts | 72 +++++++++++++++++++ 5 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 packages/core/src/utils/fetch-metadata.test.ts create mode 100644 packages/core/src/utils/fetch-metadata.ts diff --git a/packages/better-auth/src/plugins/oidc-provider/authorize.ts b/packages/better-auth/src/plugins/oidc-provider/authorize.ts index e3f14af4681..f0804f4620f 100644 --- a/packages/better-auth/src/plugins/oidc-provider/authorize.ts +++ b/packages/better-auth/src/plugins/oidc-provider/authorize.ts @@ -1,5 +1,6 @@ import type { GenericEndpointContext } from "@better-auth/core"; import { APIError } from "@better-auth/core/error"; +import { isBrowserFetchRequest } from "@better-auth/core/utils/fetch-metadata"; import { getSessionFromCtx } from "../../api"; import { generateRandomString } from "../../crypto"; import { getClient } from "./index"; @@ -28,7 +29,7 @@ export async function authorize( options: OIDCOptions, ) { const handleRedirect = (url: string) => { - const fromFetch = ctx.request?.headers.get("sec-fetch-mode") === "cors"; + const fromFetch = isBrowserFetchRequest(ctx.request?.headers); if (fromFetch) { return ctx.json({ redirect: true, diff --git a/packages/core/src/utils/fetch-metadata.test.ts b/packages/core/src/utils/fetch-metadata.test.ts new file mode 100644 index 00000000000..c4295bd5fc8 --- /dev/null +++ b/packages/core/src/utils/fetch-metadata.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from "vitest"; +import { isBrowserFetchRequest } from "./fetch-metadata"; + +describe("isBrowserFetchRequest", () => { + it("returns true for browser fetch requests", () => { + expect( + isBrowserFetchRequest( + new Headers({ + "Sec-Fetch-Mode": "cors", + }), + ), + ).toBe(true); + }); + + it("returns false for navigation requests", () => { + expect( + isBrowserFetchRequest( + new Headers({ + "Sec-Fetch-Mode": "navigate", + }), + ), + ).toBe(false); + }); + + it("returns false without fetch metadata", () => { + expect(isBrowserFetchRequest()).toBe(false); + }); +}); diff --git a/packages/core/src/utils/fetch-metadata.ts b/packages/core/src/utils/fetch-metadata.ts new file mode 100644 index 00000000000..6c1cfccf946 --- /dev/null +++ b/packages/core/src/utils/fetch-metadata.ts @@ -0,0 +1,3 @@ +export function isBrowserFetchRequest(headers?: Headers | null): boolean { + return headers?.get("sec-fetch-mode") === "cors"; +} diff --git a/packages/oauth-provider/src/authorize.ts b/packages/oauth-provider/src/authorize.ts index 33370609f92..561555b7218 100644 --- a/packages/oauth-provider/src/authorize.ts +++ b/packages/oauth-provider/src/authorize.ts @@ -1,4 +1,5 @@ import type { GenericEndpointContext } from "@better-auth/core"; +import { isBrowserFetchRequest } from "@better-auth/core/utils/fetch-metadata"; import { getSessionFromCtx } from "better-auth/api"; import { generateRandomString, makeSignature } from "better-auth/crypto"; import type { Verification } from "better-auth/db"; @@ -40,8 +41,9 @@ export function formatErrorURL( } export const handleRedirect = (ctx: GenericEndpointContext, uri: string) => { + const fromFetch = isBrowserFetchRequest(ctx.request?.headers); const acceptJson = ctx.headers?.get("accept")?.includes("application/json"); - if (acceptJson) { + if (fromFetch || acceptJson) { return { redirect: true, url: uri.toString(), diff --git a/packages/oauth-provider/src/oauth.test.ts b/packages/oauth-provider/src/oauth.test.ts index 70763547fbe..3f82848439d 100644 --- a/packages/oauth-provider/src/oauth.test.ts +++ b/packages/oauth-provider/src/oauth.test.ts @@ -285,6 +285,78 @@ describe("oauth", async () => { expect(callbackUrl).toContain("/success"); }); + it("should return a JSON redirect after email sign-in in a fetch-based oauth flow", async ({ + onTestFinished, + }) => { + if (!oauthClient?.client_id || !oauthClient?.client_secret) { + throw Error("beforeAll not run properly"); + } + + const { customFetchImpl: customFetchImplRP } = await createTestInstance(); + + const client = createAuthClient({ + plugins: [genericOAuthClient()], + baseURL: rpBaseUrl, + fetchOptions: { + customFetchImpl: customFetchImplRP, + }, + }); + const headers = new Headers(); + const data = await client.signIn.oauth2( + { + providerId, + callbackURL: "/success", + }, + { + throw: true, + onSuccess: cookieSetter(headers), + }, + ); + + let loginRedirectUri = ""; + await authClient.$fetch(data.url, { + method: "GET", + onError(ctx) { + loginRedirectUri = ctx.response.headers.get("Location") || ""; + }, + }); + expect(loginRedirectUri).toContain("/login"); + + vi.stubGlobal("window", { + location: { + href: "", + search: new URL(loginRedirectUri, authServerBaseUrl).search, + }, + }); + onTestFinished(() => { + vi.unstubAllGlobals(); + }); + + let signInLocationHeader = ""; + const signInResponse = await authClient.signIn.email( + { + email: testUser.email, + password: testUser.password, + }, + { + headers: { + "Sec-Fetch-Mode": "cors", + }, + throw: true, + onResponse(ctx) { + signInLocationHeader = ctx.response.headers.get("Location") || ""; + }, + }, + ); + + expect(signInLocationHeader).toBe(""); + expect(signInResponse.redirect).toBe(true); + expect(signInResponse.url).toContain( + `${rpBaseUrl}/api/auth/oauth2/callback/${providerId}`, + ); + expect(signInResponse.url).not.toContain(`${authServerBaseUrl}/login`); + }); + it("should sign in using generic oauth discovery", async ({ onTestFinished, }) => { From b9e54c9afacdc4e7f1a1b1b4d4914ac2ff25b340 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Tue, 10 Mar 2026 13:34:53 -0700 Subject: [PATCH 15/88] fix(db): use `CREATE INDEX` for postgres migration (#8538) --- .../src/db/get-migration-schema.test.ts | 80 ++++++++++++++++++- packages/better-auth/src/db/get-migration.ts | 12 +-- 2 files changed, 85 insertions(+), 7 deletions(-) diff --git a/packages/better-auth/src/db/get-migration-schema.test.ts b/packages/better-auth/src/db/get-migration-schema.test.ts index 7a6eae6d513..fc60bd26d07 100644 --- a/packages/better-auth/src/db/get-migration-schema.test.ts +++ b/packages/better-auth/src/db/get-migration-schema.test.ts @@ -1,3 +1,4 @@ +import { DatabaseSync } from "node:sqlite"; import type { BetterAuthOptions } from "@better-auth/core"; import { CamelCasePlugin, Kysely, PostgresDialect } from "kysely"; import { Pool } from "pg"; @@ -402,7 +403,6 @@ describe.runIf(isPostgresAvailable)("PostgreSQL Column Additions", () => { }, ]; const { toBeAdded, toBeCreated } = await getMigrations(config); - console.log(toBeAdded); expect(toBeCreated.length).toBe(0); expect(toBeAdded.length).toBe(2); expect(toBeAdded).toEqual( @@ -422,4 +422,82 @@ describe.runIf(isPostgresAvailable)("PostgreSQL Column Additions", () => { ]), ); }); + + /** + * @see https://github.com/better-auth/better-auth/issues/8536 + */ + it("should generate valid PostgreSQL CREATE INDEX syntax for indexed columns added to existing tables", async () => { + const config: BetterAuthOptions = { + database: schemaPool, + emailAndPassword: { + enabled: true, + }, + }; + + const initial = await getMigrations(config); + await initial.runMigrations(); + + config.plugins = [ + { + id: "test-index", + schema: { + user: { + fields: { + externalId: { + type: "string", + index: true, + required: false, + }, + }, + }, + }, + }, + ]; + + const { compileMigrations } = await getMigrations(config); + const sql = (await compileMigrations()).toLowerCase(); + + expect(sql).toContain("create index"); + expect(sql).not.toContain("add index"); + }); +}); + +/** + * @see https://github.com/better-auth/better-auth/issues/8536 + */ +describe("index generation for columns added to existing tables", () => { + it("should use CREATE INDEX when adding indexed columns to existing SQLite tables", async () => { + const config: BetterAuthOptions = { + database: new DatabaseSync(":memory:"), + emailAndPassword: { + enabled: true, + }, + }; + + const initial = await getMigrations(config); + await initial.runMigrations(); + + config.plugins = [ + { + id: "test-index", + schema: { + user: { + fields: { + externalId: { + type: "string", + index: true, + required: false, + }, + }, + }, + }, + }, + ]; + + const { compileMigrations } = await getMigrations(config); + const sql = (await compileMigrations()).toLowerCase(); + + expect(sql).toContain("create index"); + expect(sql).not.toContain("add index"); + }); }); diff --git a/packages/better-auth/src/db/get-migration.ts b/packages/better-auth/src/db/get-migration.ts index de416da459f..bc4edd3874f 100644 --- a/packages/better-auth/src/db/get-migration.ts +++ b/packages/better-auth/src/db/get-migration.ts @@ -9,7 +9,6 @@ import { createLogger } from "@better-auth/core/env"; import type { KyselyDatabaseType } from "@better-auth/kysely-adapter"; import { createKyselyAdapter } from "@better-auth/kysely-adapter"; import type { - AlterTableBuilder, AlterTableColumnAlteringBuilder, ColumnDataType, CreateIndexBuilder, @@ -279,7 +278,6 @@ export async function getMigrations(config: BetterAuthOptions) { const migrations: ( | AlterTableColumnAlteringBuilder - | ReturnType | CreateTableBuilder | CreateIndexBuilder )[] = []; @@ -431,10 +429,12 @@ export async function getMigrations(config: BetterAuthOptions) { const builder = db.schema.alterTable(table.table); if (field.index) { - const index = db.schema - .alterTable(table.table) - .addIndex(`${table.table}_${fieldName}_idx`); - migrations.push(index); + const indexName = `${table.table}_${fieldName}_${field.unique ? "uidx" : "idx"}`; + const indexBuilder = db.schema + .createIndex(indexName) + .on(table.table) + .columns([fieldName]); + migrations.push(field.unique ? indexBuilder.unique() : indexBuilder); } const built = builder.addColumn(fieldName, type, (col) => { From 024e7a954aa9ac628921499163981ee499b13bd0 Mon Sep 17 00:00:00 2001 From: Kamil Marczak <79667721+qamarq@users.noreply.github.com> Date: Mon, 9 Mar 2026 18:39:16 +0100 Subject: [PATCH 16/88] docs: add better-auth-usos plugin (#8493) --- .cspell/names.txt | 1 + landing/components/community-plugins-table.tsx | 11 +++++++++++ landing/lib/community-plugins-data.ts | 11 +++++++++++ 3 files changed, 23 insertions(+) diff --git a/.cspell/names.txt b/.cspell/names.txt index 385f71ca08e..850b60a990b 100644 --- a/.cspell/names.txt +++ b/.cspell/names.txt @@ -28,3 +28,4 @@ guilhermejansen iamjasonkendrick ejirocodes 0-Sandy +qamarq diff --git a/landing/components/community-plugins-table.tsx b/landing/components/community-plugins-table.tsx index ca83e65ab29..4437bbb9929 100644 --- a/landing/components/community-plugins-table.tsx +++ b/landing/components/community-plugins-table.tsx @@ -301,6 +301,17 @@ export const communityPlugins: CommunityPlugin[] = [ avatar: "https://github.com/0-Sandy.png", }, }, + { + name: "better-auth-usos", + url: "https://github.com/qamarq/better-auth-usos", + description: + "USOS plugin for Better Auth - allows students to authenticate using their university credentials via the USOS API. Using oauth 1a.", + author: { + name: "qamarq", + github: "qamarq", + avatar: "https://github.com/qamarq.png", + }, + }, ]; export function CommunityPluginsTable() { const [sorting, setSorting] = useState([]); diff --git a/landing/lib/community-plugins-data.ts b/landing/lib/community-plugins-data.ts index a659b5fad45..ea9860c92a2 100644 --- a/landing/lib/community-plugins-data.ts +++ b/landing/lib/community-plugins-data.ts @@ -215,4 +215,15 @@ export const communityPlugins: CommunityPlugin[] = [ avatar: "https://github.com/iamjasonkendrick.png", }, }, + { + name: "better-auth-usos", + url: "https://github.com/qamarq/better-auth-usos", + description: + "USOS plugin for Better Auth - allows students to authenticate using their university credentials via the USOS API. Using oauth 1a.", + author: { + name: "qamarq", + github: "qamarq", + avatar: "https://github.com/qamarq.png", + }, + }, ]; From 67c6dc2d3233c9492ce08333bd3a4de182eec84d Mon Sep 17 00:00:00 2001 From: Sandy Date: Mon, 9 Mar 2026 15:07:09 -0300 Subject: [PATCH 17/88] fix(blog): fix RSS feed link path, image path and blog date (#8483) --- landing/lib/rss.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/landing/lib/rss.ts b/landing/lib/rss.ts index 32111fd9f11..93325ba1d97 100644 --- a/landing/lib/rss.ts +++ b/landing/lib/rss.ts @@ -25,10 +25,12 @@ export function getRSS() { title: page.data.title, description: page.data.description, image: page.data.image - ? `${baseUrl}${page.data.image.startsWith("/") ? page.data.image.slice(1) : page.data.image}` + ? page.data.image.startsWith("/") + ? `${baseUrl}${page.data.image.slice(1)}` + : page.data.image : undefined, - link: `${baseUrl}${url.startsWith("/") ? url.slice(1) : url}`, - date: new Date(page.data.lastModified ?? page.data.date), + link: url.startsWith("/") ? `${baseUrl}${url.slice(1)}` : url, + date: new Date(page.data.date), author: page.data.author ? [ { From 362df86d78b3e89681819f39679ce73432ca2ac1 Mon Sep 17 00:00:00 2001 From: Igor Makowski <56691628+Mnigos@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:09:13 +0100 Subject: [PATCH 18/88] docs(dodopayments): use checkoutSession in docs (#8501) --- docs/content/docs/plugins/dodopayments.mdx | 25 +++++++++------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/docs/content/docs/plugins/dodopayments.mdx b/docs/content/docs/plugins/dodopayments.mdx index d1acf94770a..126917454fc 100644 --- a/docs/content/docs/plugins/dodopayments.mdx +++ b/docs/content/docs/plugins/dodopayments.mdx @@ -99,6 +99,7 @@ export const auth = betterAuth({ Create or update `src/lib/auth-client.ts`: ```typescript +import { createAuthClient } from "better-auth/react"; import { dodopaymentsClient } from "@dodopayments/better-auth"; export const authClient = createAuthClient({ @@ -114,27 +115,21 @@ export const authClient = createAuthClient({ ### Creating a Checkout Session ```typescript -const { data: checkout, error } = await authClient.dodopayments.checkout({ +const { data: checkoutSession, error } = + await authClient.dodopayments.checkoutSession({ slug: "premium-plan", - customer: { - email: "customer@example.com", - name: "John Doe", - }, - billing: { - city: "San Francisco", - country: "US", - state: "CA", - street: "123 Market St", - zipcode: "94103", - }, - referenceId: "order_123", }); -if (checkout) { - window.location.href = checkout.url; +if (checkoutSession) { + window.location.href = checkoutSession.url; } ``` + + `authClient.dodopayments.checkout()` is deprecated. Use + `authClient.dodopayments.checkoutSession()` for new integrations. + + ### Accessing the Customer Portal ```typescript From 12f16c371ee47615dcecbbf30afb1cbb638aa71b Mon Sep 17 00:00:00 2001 From: Sandy Date: Mon, 9 Mar 2026 18:18:53 -0300 Subject: [PATCH 19/88] docs(metadata): centralize SEO metadata with createMetadata helper (#8486) --- landing/app/blog/[[...slug]]/page.tsx | 9 ++--- landing/app/blog/layout.tsx | 29 ++++++++++++----- landing/app/careers/page.tsx | 5 +-- landing/app/changelog/page.tsx | 7 ++-- landing/app/community/page.tsx | 5 +-- landing/app/docs/[[...slug]]/page.tsx | 5 +-- landing/app/enterprise/page.tsx | 5 +-- landing/app/layout.tsx | 35 ++------------------ landing/app/products/[tab]/page.tsx | 3 +- landing/lib/metadata.ts | 47 +++++++++++++++++++++++++++ landing/lib/rss.ts | 2 +- landing/lib/utils.ts | 8 ----- 12 files changed, 95 insertions(+), 65 deletions(-) create mode 100644 landing/lib/metadata.ts diff --git a/landing/app/blog/[[...slug]]/page.tsx b/landing/app/blog/[[...slug]]/page.tsx index e3d99cdb849..24f3f76ee07 100644 --- a/landing/app/blog/[[...slug]]/page.tsx +++ b/landing/app/blog/[[...slug]]/page.tsx @@ -7,6 +7,7 @@ import Link from "next/link"; import { notFound } from "next/navigation"; import { BlogLeftPanel } from "@/components/blog/blog-left-panel"; import { Callout } from "@/components/ui/callout"; +import { createMetadata } from "@/lib/metadata"; import { blogs } from "@/lib/source"; import { cn } from "@/lib/utils"; @@ -270,10 +271,10 @@ export async function generateMetadata({ }) { const { slug } = await params; if (!slug) { - return { + return createMetadata({ title: "Blog - Better Auth", description: "Latest updates, articles, and insights about Better Auth", - }; + }); } const page = blogs.getPage(slug); if (!page || page.data.draft) return notFound(); @@ -296,7 +297,7 @@ export async function generateMetadata({ const ogImage = image || ogUrl; - return { + return createMetadata({ title, description, openGraph: { @@ -311,7 +312,7 @@ export async function generateMetadata({ description, images: [ogImage], }, - }; + }); } export function generateStaticParams() { diff --git a/landing/app/blog/layout.tsx b/landing/app/blog/layout.tsx index a4aea65ce8a..229959e9ce9 100644 --- a/landing/app/blog/layout.tsx +++ b/landing/app/blog/layout.tsx @@ -1,21 +1,34 @@ import { RootProvider } from "fumadocs-ui/provider/next"; import type { Metadata } from "next"; +import { createMetadata } from "@/lib/metadata"; -export const metadata: Metadata = { - title: "Blog - Better Auth", - description: "Latest updates, articles, and insights about Better Auth", +const description = "Latest updates, articles, and insights about Better Auth"; + +export const metadata: Metadata = createMetadata({ + title: "Blog", + description, openGraph: { + url: "/blog", title: "Blog - Better Auth", - description: "Latest updates, articles, and insights about Better Auth", + description, images: ["/api/og-release?heading=Better%20Auth%20Blog"], }, twitter: { - card: "summary_large_image", - title: "Blog - Better Auth", - description: "Latest updates, articles, and insights about Better Auth", images: ["/api/og-release?heading=Better%20Auth%20Blog"], + title: "Blog - Better Auth", + description, + }, + alternates: { + types: { + "application/rss+xml": [ + { + title: "Better Auth Blog", + url: "https://better-auth.com/blog/rss.xml", + }, + ], + }, }, -}; +}); export default function BlogLayout({ children, diff --git a/landing/app/careers/page.tsx b/landing/app/careers/page.tsx index 3f8eabcc669..c08e17ba977 100644 --- a/landing/app/careers/page.tsx +++ b/landing/app/careers/page.tsx @@ -1,10 +1,11 @@ import type { Metadata } from "next"; +import { createMetadata } from "@/lib/metadata"; import { CareersPageClient } from "./careers-client"; -export const metadata: Metadata = { +export const metadata: Metadata = createMetadata({ title: "Careers", description: "Join the Better Auth team โ€” open positions and how to apply.", -}; +}); export default function CareersPage() { return ; diff --git a/landing/app/changelog/page.tsx b/landing/app/changelog/page.tsx index 57090d91ef9..b9c9ebfcf61 100644 --- a/landing/app/changelog/page.tsx +++ b/landing/app/changelog/page.tsx @@ -1,5 +1,6 @@ import Link from "next/link"; import { HalftoneBackground } from "@/components/landing/halftone-bg"; +import { createMetadata } from "@/lib/metadata"; import { ChangelogContent } from "./changelog-content"; export const dynamic = "force-static"; @@ -148,7 +149,7 @@ export default async function ChangelogPage() { ); } -export const metadata = { - title: "Changelog - Better Auth", +export const metadata = createMetadata({ + title: "Changelog", description: "Latest changes, fixes, and updates to Better Auth", -}; +}); diff --git a/landing/app/community/page.tsx b/landing/app/community/page.tsx index 87381810beb..0812e0dc7cd 100644 --- a/landing/app/community/page.tsx +++ b/landing/app/community/page.tsx @@ -1,12 +1,13 @@ import type { Metadata } from "next"; import { getCommunityStats } from "@/lib/community-stats"; +import { createMetadata } from "@/lib/metadata"; import { CommunityPageClient } from "./community-client"; -export const metadata: Metadata = { +export const metadata: Metadata = createMetadata({ title: "Community", description: "Join the Better Auth community โ€” contributors, Discord members, and ecosystem stats.", -}; +}); export const revalidate = 21600; // Revalidate every 6 hours diff --git a/landing/app/docs/[[...slug]]/page.tsx b/landing/app/docs/[[...slug]]/page.tsx index c8a48c0fe63..902f7853bb1 100644 --- a/landing/app/docs/[[...slug]]/page.tsx +++ b/landing/app/docs/[[...slug]]/page.tsx @@ -24,6 +24,7 @@ import { GenerateSecret, } from "@/components/docs/mdx-components"; import { Callout } from "@/components/ui/callout"; +import { createMetadata } from "@/lib/metadata"; import { getSource } from "@/lib/source"; import { cn } from "@/lib/utils"; import { LLMCopyButton, ViewOptions } from "./page.client"; @@ -164,7 +165,7 @@ export async function generateMetadata({ const ogUrl = `/api/og?${ogSearchParams.toString()}`; - return { + return createMetadata({ title: page.data.title, description: page.data.description, openGraph: { @@ -186,5 +187,5 @@ export async function generateMetadata({ description: page.data.description, images: [ogUrl], }, - }; + }); } diff --git a/landing/app/enterprise/page.tsx b/landing/app/enterprise/page.tsx index dacddd4c055..d5e56aa0a66 100644 --- a/landing/app/enterprise/page.tsx +++ b/landing/app/enterprise/page.tsx @@ -1,11 +1,12 @@ import type { Metadata } from "next"; +import { createMetadata } from "@/lib/metadata"; import { EnterprisePageClient } from "./enterprise-client"; -export const metadata: Metadata = { +export const metadata: Metadata = createMetadata({ title: "Enterprise", description: "Better Auth for enterprise โ€” SSO, SAML, audit logs, and dedicated support.", -}; +}); export default function EnterprisePage() { return ; diff --git a/landing/app/layout.tsx b/landing/app/layout.tsx index 8d78b488b94..25b3466f9ab 100644 --- a/landing/app/layout.tsx +++ b/landing/app/layout.tsx @@ -7,6 +7,7 @@ import Script from "next/script"; import type { ReactNode } from "react"; import { StaggeredNavFiles } from "@/components/landing/staggered-nav-files"; import { Providers } from "@/components/providers"; +import { createMetadata } from "@/lib/metadata"; const fontSans = Geist({ subsets: ["latin"], @@ -18,43 +19,13 @@ const fontMono = Geist_Mono({ variable: "--font-mono", }); -export const metadata: Metadata = { - metadataBase: new URL( - process.env.VERCEL_URL - ? `https://${process.env.VERCEL_URL}` - : process.env.NODE_ENV === "production" - ? "https://better-auth.com" - : (process.env.NEXT_PUBLIC_URL ?? "http://localhost:3000"), - ), +export const metadata: Metadata = createMetadata({ title: { template: "%s | Better Auth", default: "Better Auth", }, description: "The Most Comprehensive Authentication Framework", - icons: { - icon: [ - { url: "/favicon/favicon.ico", sizes: "any" }, - { - url: "/favicon/favicon-32x32.png", - sizes: "32x32", - type: "image/png", - }, - { - url: "/favicon/favicon-16x16.png", - sizes: "16x16", - type: "image/png", - }, - ], - apple: "/favicon/apple-touch-icon.png", - }, - openGraph: { - images: ["/og.png"], - }, - twitter: { - card: "summary_large_image", - images: ["/og.png"], - }, -}; +}); export default function RootLayout({ children }: { children: ReactNode }) { return ( diff --git a/landing/app/products/[tab]/page.tsx b/landing/app/products/[tab]/page.tsx index fbede66619f..8c75ed74819 100644 --- a/landing/app/products/[tab]/page.tsx +++ b/landing/app/products/[tab]/page.tsx @@ -1,5 +1,6 @@ import type { Metadata } from "next"; import { redirect } from "next/navigation"; +import { createMetadata } from "@/lib/metadata"; import { FrameworkContent } from "./_components/framework-content"; import { InfrastructureContent } from "./_components/infrastructure-content"; @@ -30,7 +31,7 @@ export async function generateMetadata({ const { tab } = await params; const meta = tabs[tab as Tab]; if (!meta) return {}; - return { title: meta.title, description: meta.description }; + return createMetadata({ title: meta.title, description: meta.description }); } export default async function TabPage({ diff --git a/landing/lib/metadata.ts b/landing/lib/metadata.ts new file mode 100644 index 00000000000..ae0a90fa2f5 --- /dev/null +++ b/landing/lib/metadata.ts @@ -0,0 +1,47 @@ +import type { Metadata } from "next"; + +export function createMetadata(override: Metadata): Metadata { + return { + ...override, + metadataBase: baseUrl, + openGraph: { + title: override.title ?? undefined, + description: override.description ?? undefined, + url: "https://better-auth.com", + images: "/og.png", + siteName: "Better Auth", + ...override.openGraph, + }, + twitter: { + card: "summary_large_image", + title: override.title ?? undefined, + description: override.description ?? undefined, + images: "/og.png", + ...override.twitter, + }, + icons: { + icon: [ + { url: "/favicon/favicon.ico", sizes: "any" }, + { + url: "/favicon/favicon-32x32.png", + sizes: "32x32", + type: "image/png", + }, + { + url: "/favicon/favicon-16x16.png", + sizes: "16x16", + type: "image/png", + }, + ], + apple: "/favicon/apple-touch-icon.png", + }, + }; +} + +export const baseUrl = + process.env.NODE_ENV === "development" || + (!process.env.VERCEL_PROJECT_PRODUCTION_URL && !process.env.VERCEL_URL) + ? new URL("http://localhost:3000") + : new URL( + `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL || process.env.VERCEL_URL}`, + ); diff --git a/landing/lib/rss.ts b/landing/lib/rss.ts index 93325ba1d97..85ebafd720e 100644 --- a/landing/lib/rss.ts +++ b/landing/lib/rss.ts @@ -1,6 +1,6 @@ import { Feed } from "feed"; +import { baseUrl } from "./metadata"; import { blogs } from "./source"; -import { baseUrl } from "./utils"; export function getRSS() { const feed = new Feed({ diff --git a/landing/lib/utils.ts b/landing/lib/utils.ts index 8a90058be7f..7d63e21d50f 100644 --- a/landing/lib/utils.ts +++ b/landing/lib/utils.ts @@ -19,11 +19,3 @@ export function mergeRefs( }); }; } - -export const baseUrl = - process.env.NODE_ENV === "development" || - (!process.env.VERCEL_PROJECT_PRODUCTION_URL && !process.env.VERCEL_URL) - ? new URL("http://localhost:3000") - : new URL( - `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL || process.env.VERCEL_URL}`, - ); From ff352c6291cd73e7e8640cd1dede1a72cd56b825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A9l=20Solano?= Date: Wed, 11 Mar 2026 03:15:22 +0100 Subject: [PATCH 20/88] fix(oidc-provider): validate redirect_uri for prompt=none (#8398) --- .../src/plugins/oidc-provider/authorize.ts | 31 ++++++- .../src/plugins/oidc-provider/error.ts | 13 ++- .../src/plugins/oidc-provider/oidc.test.ts | 81 +++++++++++++++---- 3 files changed, 103 insertions(+), 22 deletions(-) diff --git a/packages/better-auth/src/plugins/oidc-provider/authorize.ts b/packages/better-auth/src/plugins/oidc-provider/authorize.ts index f0804f4620f..b9c6c8f76d3 100644 --- a/packages/better-auth/src/plugins/oidc-provider/authorize.ts +++ b/packages/better-auth/src/plugins/oidc-provider/authorize.ts @@ -3,6 +3,7 @@ import { APIError } from "@better-auth/core/error"; import { isBrowserFetchRequest } from "@better-auth/core/utils/fetch-metadata"; import { getSessionFromCtx } from "../../api"; import { generateRandomString } from "../../crypto"; +import { InvalidClient, InvalidRequest } from "./error"; import { getClient } from "./index"; import type { AuthorizationQuery, OIDCOptions } from "./types"; import { parsePrompt } from "./utils/prompt"; @@ -58,15 +59,38 @@ export async function authorize( error: "invalid_request", }); } + const query = ctx.query as AuthorizationQuery; const session = await getSessionFromCtx(ctx); if (!session) { // Handle prompt=none per OIDC spec - must return error instead of redirecting - const query = ctx.query as AuthorizationQuery; const promptSet = parsePrompt(query.prompt ?? ""); - if (promptSet.has("none") && query.redirect_uri) { + if (promptSet.has("none")) { + if (!query.redirect_uri) { + throw new InvalidRequest( + "redirect_uri is required when prompt=none and must be usable to return errors without displaying UI", + ); + } + if (!query.client_id) { + throw new InvalidClient("client_id is required"); + } + const client = await getClient( + query.client_id, + options.trustedClients || [], + ); + if (!client) { + throw new InvalidClient("client_id is required"); + } + const validRedirectURI = client.redirectUrls.find( + (url) => url === query.redirect_uri, + ); + if (!validRedirectURI) { + throw new InvalidRequest( + "redirect_uri is invalid or not registered for this client", + ); + } return handleRedirect( formatErrorURL( - query.redirect_uri, + validRedirectURI, "login_required", "Authentication required but prompt is none", ), @@ -91,7 +115,6 @@ export async function authorize( return handleRedirect(`${options.loginPage}?${queryFromURL}`); } - const query = ctx.query as AuthorizationQuery; if (!query.client_id) { const errorURL = getErrorURL( ctx, diff --git a/packages/better-auth/src/plugins/oidc-provider/error.ts b/packages/better-auth/src/plugins/oidc-provider/error.ts index 696a803d9de..5d122e39c60 100644 --- a/packages/better-auth/src/plugins/oidc-provider/error.ts +++ b/packages/better-auth/src/plugins/oidc-provider/error.ts @@ -5,9 +5,20 @@ class OIDCProviderError extends APIError {} export class InvalidRequest extends OIDCProviderError { constructor(error_description: string, error_detail?: string) { super("BAD_REQUEST", { - message: "invalid_request", + message: error_description, + error: "invalid_request", error_description, error_detail, }); } } + +export class InvalidClient extends OIDCProviderError { + constructor(error_description: string) { + super("BAD_REQUEST", { + message: error_description, + error: "invalid_client", + error_description, + }); + } +} diff --git a/packages/better-auth/src/plugins/oidc-provider/oidc.test.ts b/packages/better-auth/src/plugins/oidc-provider/oidc.test.ts index 6ee3e60926a..ffa12693395 100644 --- a/packages/better-auth/src/plugins/oidc-provider/oidc.test.ts +++ b/packages/better-auth/src/plugins/oidc-provider/oidc.test.ts @@ -460,24 +460,22 @@ describe("oidc", async () => { it("should return login_required error when prompt=none and user not authenticated", async ({ expect, }) => { - // Create an unauthenticated client - const unauthClient = createAuthClient({ - plugins: [oidcClient()], - baseURL: "http://localhost:3000", - fetchOptions: { - customFetchImpl, - }, + // Create an OAuth client + const testClient = await serverClient.oauth2.register({ + client_name: "test-login-required-prompt-none", + redirect_uris: [ + "http://localhost:3000/api/auth/oauth2/callback/login-required", + ], }); + const clientId = testClient.data?.client_id ?? ""; + const redirectUri = testClient.data?.redirect_uris?.[0] ?? ""; // Try to authorize with prompt=none const authUrl = new URL( "http://localhost:3000/api/auth/oauth2/authorize", ); - authUrl.searchParams.set("client_id", application.clientId); - authUrl.searchParams.set( - "redirect_uri", - application.redirectUrls[0] || "", - ); + authUrl.searchParams.set("client_id", clientId); + authUrl.searchParams.set("redirect_uri", redirectUri); authUrl.searchParams.set("response_type", "code"); authUrl.searchParams.set("scope", "openid profile email"); authUrl.searchParams.set("state", "test-state"); @@ -485,13 +483,11 @@ describe("oidc", async () => { authUrl.searchParams.set("code_challenge", "test-challenge"); authUrl.searchParams.set("code_challenge_method", "S256"); - let redirectURI = ""; - await unauthClient.$fetch(authUrl.toString(), { + const response = await customFetchImpl(authUrl.toString(), { method: "GET", - onError(context) { - redirectURI = context.response.headers.get("Location") || ""; - }, + redirect: "manual", }); + const redirectURI = response.headers.get("Location") || ""; expect(redirectURI).toContain("error=login_required"); expect(redirectURI).toContain("error_description=Authentication"); @@ -499,6 +495,57 @@ describe("oidc", async () => { expect(redirectURI).toContain("none"); }); + it("should not redirect to invalid redirect_uri when prompt=none", async ({ + expect, + }) => { + const attackerRedirect = "https://malicious.com/callback"; + const authUrl = new URL( + "http://localhost:3000/api/auth/oauth2/authorize", + ); + authUrl.searchParams.set("client_id", application.clientId); + authUrl.searchParams.set("redirect_uri", attackerRedirect); + authUrl.searchParams.set("response_type", "code"); + authUrl.searchParams.set("scope", "openid"); + authUrl.searchParams.set("state", "x"); + authUrl.searchParams.set("prompt", "none"); + + const response = await customFetchImpl(authUrl.toString(), { + method: "GET", + redirect: "manual", + }); + + const location = response.headers.get("Location") || ""; + expect(location === null || location === "").not.toContain( + "malicious.com", + ); + expect([400, 302]).toContain(response.status); + }); + + it("should return 400 invalid_request when prompt=none without redirect_uri", async ({ + expect, + }) => { + const authUrl = new URL( + "http://localhost:3000/api/auth/oauth2/authorize", + ); + authUrl.searchParams.set("client_id", application.clientId); + authUrl.searchParams.set("response_type", "code"); + authUrl.searchParams.set("scope", "openid"); + authUrl.searchParams.set("state", "x"); + authUrl.searchParams.set("prompt", "none"); + // No redirect_uri - must not fall through to login page + + const response = await customFetchImpl(authUrl.toString(), { + method: "GET", + redirect: "manual", + }); + + expect(response.status).toBe(400); + const location = response.headers.get("Location") || ""; + expect(location).not.toContain("/login"); + const body = await response.json().catch(() => ({})); + expect(body.error ?? body.code).toBe("invalid_request"); + }); + it("should return consent_required error when prompt=none and consent needed", async ({ expect, }) => { From 497b1db8d8c7253c9c764c2d560e09b1e553f9b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A9l=20Solano?= Date: Wed, 11 Mar 2026 05:06:54 +0100 Subject: [PATCH 21/88] fix: add origin check middleware to password reset request (#8392) --- .../src/api/routes/password.test.ts | 20 +++++++++++++++++++ .../better-auth/src/api/routes/password.ts | 1 + 2 files changed, 21 insertions(+) diff --git a/packages/better-auth/src/api/routes/password.test.ts b/packages/better-auth/src/api/routes/password.test.ts index ebb5c30056d..ed3b110dce8 100644 --- a/packages/better-auth/src/api/routes/password.test.ts +++ b/packages/better-auth/src/api/routes/password.test.ts @@ -37,6 +37,26 @@ describe("forget password", async () => { expect(token.length).toBeGreaterThan(10); }); + it("should reject untrusted redirectTo", async () => { + const { client, testUser } = await getTestInstance({ + emailAndPassword: { + enabled: true, + async sendResetPassword() {}, + }, + trustedOrigins: ["http://localhost:3000"], + advanced: { + disableOriginCheck: false, + }, + }); + const res = await client.requestPasswordReset({ + email: testUser.email, + redirectTo: "http://malicious.com", + }); + + expect(res.error?.status).toBe(403); + expect(res.error?.message).toBe("Invalid redirectURL"); + }); + it("should fail on invalid password", async () => { const res = await client.resetPassword( { diff --git a/packages/better-auth/src/api/routes/password.ts b/packages/better-auth/src/api/routes/password.ts index d6e247a7dfa..5a2b15a3420 100644 --- a/packages/better-auth/src/api/routes/password.ts +++ b/packages/better-auth/src/api/routes/password.ts @@ -84,6 +84,7 @@ export const requestPasswordReset = createAuthEndpoint( }, }, }, + use: [originCheck((ctx) => ctx.body.redirectTo)], }, async (ctx) => { if (!ctx.context.options.emailAndPassword?.sendResetPassword) { From 90597e0aa57d3e04d754308d2f2a1486cbd58a90 Mon Sep 17 00:00:00 2001 From: Zeljko Vranjes Date: Wed, 11 Mar 2026 12:29:36 -0400 Subject: [PATCH 22/88] docs: update SolidStart auth handler file path (#8470) --- docs/content/docs/integrations/solid-start.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/docs/integrations/solid-start.mdx b/docs/content/docs/integrations/solid-start.mdx index d833a33cebd..45963639d85 100644 --- a/docs/content/docs/integrations/solid-start.mdx +++ b/docs/content/docs/integrations/solid-start.mdx @@ -7,9 +7,9 @@ Before you start, make sure you have a Better Auth instance configured. If you h ### Mount the handler -We need to mount the handler to SolidStart server. Put the following code in your `*auth.ts` file inside `/routes/api/auth` folder. +We need to mount the handler to SolidStart server. Put the following code in your `[...auth].ts` file inside `/routes/api/auth` folder. -```ts title="*auth.ts" +```ts title="[...auth].ts" import { auth } from "~/lib/auth"; import { toSolidStartHandler } from "better-auth/solid-start"; From db5a44424f5747c47a7da347613e42b664e1e734 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Wed, 11 Mar 2026 10:30:41 -0700 Subject: [PATCH 23/88] chore: release v1.5.5 --- packages/api-key/package.json | 2 +- packages/better-auth/package.json | 2 +- packages/cli/package.json | 2 +- packages/core/package.json | 2 +- packages/drizzle-adapter/package.json | 2 +- packages/electron/package.json | 2 +- packages/expo/package.json | 2 +- packages/i18n/package.json | 2 +- packages/kysely-adapter/package.json | 2 +- packages/memory-adapter/package.json | 2 +- packages/mongo-adapter/package.json | 2 +- packages/oauth-provider/package.json | 2 +- packages/passkey/package.json | 2 +- packages/prisma-adapter/package.json | 2 +- packages/redis-storage/package.json | 2 +- packages/scim/package.json | 2 +- packages/sso/package.json | 2 +- packages/stripe/package.json | 2 +- packages/telemetry/package.json | 2 +- packages/test-utils/package.json | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/api-key/package.json b/packages/api-key/package.json index 9d38b7f9229..88d0a640177 100644 --- a/packages/api-key/package.json +++ b/packages/api-key/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/api-key", - "version": "1.5.4", + "version": "1.5.5", "description": "API Key plugin for Better Auth.", "type": "module", "license": "MIT", diff --git a/packages/better-auth/package.json b/packages/better-auth/package.json index 7d3003b6776..c5b4b7645b0 100644 --- a/packages/better-auth/package.json +++ b/packages/better-auth/package.json @@ -1,6 +1,6 @@ { "name": "better-auth", - "version": "1.5.4", + "version": "1.5.5", "description": "The most comprehensive authentication framework for TypeScript.", "type": "module", "license": "MIT", diff --git a/packages/cli/package.json b/packages/cli/package.json index cc88370bc9b..893adf82e72 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "auth", - "version": "1.5.4", + "version": "1.5.5", "description": "The CLI for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/core/package.json b/packages/core/package.json index dcc86340185..e5beedd47c9 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/core", - "version": "1.5.4", + "version": "1.5.5", "description": "The most comprehensive authentication framework for TypeScript.", "type": "module", "license": "MIT", diff --git a/packages/drizzle-adapter/package.json b/packages/drizzle-adapter/package.json index 64729558bab..5fa77c14dff 100644 --- a/packages/drizzle-adapter/package.json +++ b/packages/drizzle-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/drizzle-adapter", - "version": "1.5.4", + "version": "1.5.5", "description": "Drizzle adapter for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/electron/package.json b/packages/electron/package.json index b63480f1cb5..9ebe65da10f 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/electron", - "version": "1.5.4", + "version": "1.5.5", "description": "Better Auth integration for Electron applications.", "type": "module", "license": "MIT", diff --git a/packages/expo/package.json b/packages/expo/package.json index c3b543fc74b..c954d76616b 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/expo", - "version": "1.5.4", + "version": "1.5.5", "description": "Better Auth integration for Expo and React Native applications.", "type": "module", "license": "MIT", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 9513d1fe203..834a0069a7d 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/i18n", - "version": "1.5.4", + "version": "1.5.5", "description": "i18n plugin for Better Auth - translate error messages", "type": "module", "license": "MIT", diff --git a/packages/kysely-adapter/package.json b/packages/kysely-adapter/package.json index ca5ba229c7f..6fee5395b32 100644 --- a/packages/kysely-adapter/package.json +++ b/packages/kysely-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/kysely-adapter", - "version": "1.5.4", + "version": "1.5.5", "description": "Kysely adapter for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/memory-adapter/package.json b/packages/memory-adapter/package.json index e7b662998ae..bfa5ae3f187 100644 --- a/packages/memory-adapter/package.json +++ b/packages/memory-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/memory-adapter", - "version": "1.5.4", + "version": "1.5.5", "description": "Memory adapter for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/mongo-adapter/package.json b/packages/mongo-adapter/package.json index 749f53e6d4e..9eabdd2c4cd 100644 --- a/packages/mongo-adapter/package.json +++ b/packages/mongo-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/mongo-adapter", - "version": "1.5.4", + "version": "1.5.5", "description": "Mongo adapter for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/oauth-provider/package.json b/packages/oauth-provider/package.json index bec977286ec..fb0f1a5fd18 100644 --- a/packages/oauth-provider/package.json +++ b/packages/oauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/oauth-provider", - "version": "1.5.4", + "version": "1.5.5", "description": "An oauth provider plugin for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/passkey/package.json b/packages/passkey/package.json index bb1fcf7de40..cc7ef46b665 100644 --- a/packages/passkey/package.json +++ b/packages/passkey/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/passkey", - "version": "1.5.4", + "version": "1.5.5", "description": "Passkey plugin for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/prisma-adapter/package.json b/packages/prisma-adapter/package.json index 8676e35671d..e2377f46dbc 100644 --- a/packages/prisma-adapter/package.json +++ b/packages/prisma-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/prisma-adapter", - "version": "1.5.4", + "version": "1.5.5", "description": "Prisma adapter for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/redis-storage/package.json b/packages/redis-storage/package.json index a10f82e69ba..fee44c36d48 100644 --- a/packages/redis-storage/package.json +++ b/packages/redis-storage/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/redis-storage", - "version": "1.5.4", + "version": "1.5.5", "description": "Redis storage for Better Auth secondary storage", "type": "module", "license": "MIT", diff --git a/packages/scim/package.json b/packages/scim/package.json index 3360db12b9d..f69952004d7 100644 --- a/packages/scim/package.json +++ b/packages/scim/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/scim", - "version": "1.5.4", + "version": "1.5.5", "description": "SCIM plugin for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/sso/package.json b/packages/sso/package.json index 80a06758138..b99bebc5b76 100644 --- a/packages/sso/package.json +++ b/packages/sso/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/sso", - "version": "1.5.4", + "version": "1.5.5", "description": "SSO plugin for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/stripe/package.json b/packages/stripe/package.json index 4275b1f0f82..fbc44eec4a1 100644 --- a/packages/stripe/package.json +++ b/packages/stripe/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/stripe", - "version": "1.5.4", + "version": "1.5.5", "description": "Stripe plugin for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index 853653ad7b8..bc2c2aab16d 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/telemetry", - "version": "1.5.4", + "version": "1.5.5", "description": "Telemetry package for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index f4ac00b8cec..83998899223 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/test-utils", - "version": "1.5.4", + "version": "1.5.5", "description": "Testing utilities for Better Auth adapter development", "type": "module", "license": "MIT", From 64339f06459b0ff940cae8bbda705371c216de39 Mon Sep 17 00:00:00 2001 From: Maxwell <145994855+ping-maxwell@users.noreply.github.com> Date: Fri, 13 Mar 2026 11:21:29 -0700 Subject: [PATCH 24/88] docs: custom AI chat (#8523) Co-authored-by: Sandy --- .cspell/custom-words.txt | 2 +- .cspell/tech-terms.txt | 2 + docs/content/docs/concepts/api.mdx | 2 +- docs/content/docs/concepts/cli.mdx | 2 +- docs/content/docs/concepts/client.mdx | 2 +- docs/content/docs/concepts/cookies.mdx | 2 +- docs/content/docs/concepts/database.mdx | 2 +- docs/content/docs/concepts/email.mdx | 2 +- docs/content/docs/concepts/hooks.mdx | 2 +- docs/content/docs/concepts/oauth.mdx | 2 +- docs/content/docs/concepts/plugins.mdx | 2 +- docs/content/docs/concepts/rate-limit.mdx | 2 +- .../docs/concepts/session-management.mdx | 2 +- docs/content/docs/concepts/typescript.mdx | 2 +- docs/content/docs/concepts/users-accounts.mdx | 2 +- docs/content/docs/introduction.mdx | 38 +- landing/.env.example | 9 +- landing/app/api/docs/chat/route.ts | 22 +- landing/components/ai-chat.tsx | 49 +- landing/components/sidebar-content.tsx | 6 + landing/lib/ai-chat/rate-limit.ts | 46 ++ landing/lib/ai-chat/route.ts | 361 +++++++++++++ landing/package.json | 5 +- pnpm-lock.yaml | 474 ++++++------------ turbo.json | 6 +- 25 files changed, 625 insertions(+), 421 deletions(-) create mode 100644 landing/lib/ai-chat/rate-limit.ts create mode 100644 landing/lib/ai-chat/route.ts diff --git a/.cspell/custom-words.txt b/.cspell/custom-words.txt index ec455a40502..c7a994c7a18 100644 --- a/.cspell/custom-words.txt +++ b/.cspell/custom-words.txt @@ -14,4 +14,4 @@ uncompromised myapp Neue CCPA -CPRA +CPRA \ No newline at end of file diff --git a/.cspell/tech-terms.txt b/.cspell/tech-terms.txt index 0b368365d5f..baa270f7c15 100644 --- a/.cspell/tech-terms.txt +++ b/.cspell/tech-terms.txt @@ -48,3 +48,5 @@ SIEM sess reactivations whsec +moonshotai +kimi \ No newline at end of file diff --git a/docs/content/docs/concepts/api.mdx b/docs/content/docs/concepts/api.mdx index e83d55c0ad4..f36c85a0346 100644 --- a/docs/content/docs/concepts/api.mdx +++ b/docs/content/docs/concepts/api.mdx @@ -1,6 +1,6 @@ --- title: API -description: Better Auth API. +description: Learn how to call Better Auth API endpoints on the server, pass body, headers, and query parameters, retrieve response headers, and handle errors. --- When you create a new Better Auth instance, it provides you with an `api` object. This object exposes every endpoint that exists in your Better Auth instance. And you can use this to interact with Better Auth server side. diff --git a/docs/content/docs/concepts/cli.mdx b/docs/content/docs/concepts/cli.mdx index 022eefba4dc..313aa409e61 100644 --- a/docs/content/docs/concepts/cli.mdx +++ b/docs/content/docs/concepts/cli.mdx @@ -1,6 +1,6 @@ --- title: CLI -description: Built-in CLI for managing your project. +description: Learn about the Better Auth CLI commands for generating and migrating database schemas, initializing projects, generating secret keys, and gathering diagnostic info. --- Better Auth comes with a built-in CLI to help you manage the database schemas, initialize your project, generate a secret key for your application, and gather diagnostic information about your setup. diff --git a/docs/content/docs/concepts/client.mdx b/docs/content/docs/concepts/client.mdx index 975f8746bae..d2967f3fb29 100644 --- a/docs/content/docs/concepts/client.mdx +++ b/docs/content/docs/concepts/client.mdx @@ -1,6 +1,6 @@ --- title: Client -description: Better Auth client library for authentication. +description: Learn how to set up the Better Auth client for React, Vue, Svelte, and other frameworks, use hooks, configure fetch options, handle errors, and extend with client plugins. --- Better Auth offers a client library compatible with popular frontend frameworks like React, Vue, Svelte, and more. This client library includes a set of functions for interacting with the Better Auth server. Each framework's client library is built on top of a core client library that is framework-agnostic, so that all methods and hooks are consistently available across all client libraries. diff --git a/docs/content/docs/concepts/cookies.mdx b/docs/content/docs/concepts/cookies.mdx index b183baede8d..617bc631c85 100644 --- a/docs/content/docs/concepts/cookies.mdx +++ b/docs/content/docs/concepts/cookies.mdx @@ -1,6 +1,6 @@ --- title: Cookies -description: Learn how cookies are used in Better Auth. +description: Learn how Better Auth uses cookies, including cookie prefixes, custom cookie attributes, cross-subdomain sharing, secure cookies, and handling Safari ITP with proxies. --- Cookies are used to store data such as session tokens, session data, OAuth state, and more. All cookies are signed using the `secret` key provided in the auth options or the `BETTER_AUTH_SECRET` environment variable. If you use [versioned secrets](/docs/reference/options#secrets) for rotation, encrypted cookie data (such as JWE session caches) will automatically use the current key and remain decryptable with previous keys. diff --git a/docs/content/docs/concepts/database.mdx b/docs/content/docs/concepts/database.mdx index 8c7e0ec9db6..0b241565702 100644 --- a/docs/content/docs/concepts/database.mdx +++ b/docs/content/docs/concepts/database.mdx @@ -1,6 +1,6 @@ --- title: Database -description: Learn how to use a database with Better Auth. +description: Learn about database adapters, migrations, secondary storage with Redis, core schema (user, session, account, verification), custom tables, extending schemas, ID generation, database hooks, and plugin schemas. --- ## Adapters diff --git a/docs/content/docs/concepts/email.mdx b/docs/content/docs/concepts/email.mdx index 854c623a3d7..58e45713026 100644 --- a/docs/content/docs/concepts/email.mdx +++ b/docs/content/docs/concepts/email.mdx @@ -1,6 +1,6 @@ --- title: Email -description: Learn how to use email with Better Auth. +description: Learn how to set up email verification, require verified emails for sign-in, auto sign-in after verification, handle post-verification callbacks, and implement password reset emails. --- Email is a key part of Better Auth, required for all users regardless of their authentication method. Better Auth provides email and password authentication out of the box, and a lot of utilities to help you manage email verification, password reset, and more. diff --git a/docs/content/docs/concepts/hooks.mdx b/docs/content/docs/concepts/hooks.mdx index c107f35d7ac..acde7edb808 100644 --- a/docs/content/docs/concepts/hooks.mdx +++ b/docs/content/docs/concepts/hooks.mdx @@ -1,6 +1,6 @@ --- title: Hooks -description: Better Auth Hooks let you customize BetterAuth's behavior +description: Learn how to use before and after hooks to customize endpoint behavior, modify requests and responses, handle cookies, throw errors, access auth context, and run background tasks. --- Hooks in Better Auth let you "hook into" the lifecycle and execute custom logic. They provide a way to customize Better Auth's behavior without writing a full plugin. diff --git a/docs/content/docs/concepts/oauth.mdx b/docs/content/docs/concepts/oauth.mdx index 70d9e2f25c6..d61e0aeacb9 100644 --- a/docs/content/docs/concepts/oauth.mdx +++ b/docs/content/docs/concepts/oauth.mdx @@ -1,6 +1,6 @@ --- title: OAuth -description: How Better Auth handles OAuth +description: Learn how to configure social OAuth providers, sign in and link accounts, request scopes, pass additional data, refresh access tokens, map profiles, and customize provider options. --- Better Auth comes with built-in support for OAuth 2.0 and OpenID Connect. This allows you to authenticate users via popular OAuth providers like Google, Facebook, GitHub, and more. diff --git a/docs/content/docs/concepts/plugins.mdx b/docs/content/docs/concepts/plugins.mdx index 948bf4ca630..abeed842178 100644 --- a/docs/content/docs/concepts/plugins.mdx +++ b/docs/content/docs/concepts/plugins.mdx @@ -1,6 +1,6 @@ --- title: Plugins -description: Learn how to use plugins with Better Auth. +description: Learn how to use and create Better Auth plugins, including defining endpoints, schemas, hooks, middleware, rate limits, trusted origins, and building client plugins with custom actions and atoms. --- Plugins are a key part of Better Auth, they let you extend the base functionalities. You can use them to add new authentication methods, features, or customize behaviors. diff --git a/docs/content/docs/concepts/rate-limit.mdx b/docs/content/docs/concepts/rate-limit.mdx index 9c29f32bb9f..b7c950987fc 100644 --- a/docs/content/docs/concepts/rate-limit.mdx +++ b/docs/content/docs/concepts/rate-limit.mdx @@ -1,6 +1,6 @@ --- title: Rate Limit -description: How to limit the number of requests a user can make to the server in a given time period. +description: Learn how to configure rate limiting in Better Auth, including IP address detection, IPv6 support, custom rate limit windows, storage backends, error handling, and per-endpoint rules. --- Better Auth includes a built-in rate limiter to help manage traffic and prevent abuse. By default, in production mode, the rate limiter is set to: diff --git a/docs/content/docs/concepts/session-management.mdx b/docs/content/docs/concepts/session-management.mdx index 4115a53aa96..0cfdaee1eb9 100644 --- a/docs/content/docs/concepts/session-management.mdx +++ b/docs/content/docs/concepts/session-management.mdx @@ -1,6 +1,6 @@ --- title: Session Management -description: Better Auth session management. +description: Learn about session management in Better Auth, including session expiration, freshness, cookie caching strategies, secondary storage, stateless sessions, and customizing session responses. --- Better Auth manages session using a traditional cookie-based session management. The session is stored in a cookie and is sent to the server on every request. The server then verifies the session and returns the user data if the session is valid. diff --git a/docs/content/docs/concepts/typescript.mdx b/docs/content/docs/concepts/typescript.mdx index b464b113810..7ccc3135941 100644 --- a/docs/content/docs/concepts/typescript.mdx +++ b/docs/content/docs/concepts/typescript.mdx @@ -1,6 +1,6 @@ --- title: TypeScript -description: Better Auth TypeScript integration. +description: Learn about TypeScript configuration for Better Auth, including strict mode, inferring types for sessions and users, defining additional fields, and inferring additional fields on the client. --- Better Auth is designed to be type-safe. Both the client and server are built with TypeScript, allowing you to easily infer types. diff --git a/docs/content/docs/concepts/users-accounts.mdx b/docs/content/docs/concepts/users-accounts.mdx index 0851316bf9d..af699e3204c 100644 --- a/docs/content/docs/concepts/users-accounts.mdx +++ b/docs/content/docs/concepts/users-accounts.mdx @@ -1,6 +1,6 @@ --- title: User & Accounts -description: User and account management. +description: Learn how to manage users and accounts, including updating user info, changing emails and passwords, deleting users with verification, token encryption, and account linking and unlinking. --- Beyond authenticating users, Better Auth also provides a set of methods to manage users. This includes, updating user information, changing passwords, and more. diff --git a/docs/content/docs/introduction.mdx b/docs/content/docs/introduction.mdx index 68ae7c44fb9..fe35d7f39ba 100644 --- a/docs/content/docs/introduction.mdx +++ b/docs/content/docs/introduction.mdx @@ -35,33 +35,6 @@ Better Auth provides an MCP server so you can use it with any AI model that supp -#### CLI Options - -Use the Better Auth CLI to easily add the MCP server to your preferred client: - - - - ```bash title="terminal" - npx auth mcp --cursor - ``` - - - ```bash title="terminal" - npx auth mcp --claude-code - ``` - - - ```bash title="terminal" - npx auth mcp --open-code - ``` - - - ```bash title="terminal" - npx auth mcp --manual - ``` - - - #### Manual Configuration Alternatively, you can manually configure the MCP server for each client: @@ -69,7 +42,7 @@ Alternatively, you can manually configure the MCP server for each client: ```bash title="terminal" - claude mcp add --transport http better-auth https://mcp.inkeep.com/better-auth/mcp + claude mcp add --transport http better-auth https://context7.com/better-auth/better-auth ``` @@ -79,7 +52,7 @@ Alternatively, you can manually configure the MCP server for each client: "mcp": { "better-auth": { "type": "remote", - "url": "https://mcp.inkeep.com/better-auth/mcp", + "url": "https://context7.com/better-auth/better-auth", "enabled": true, } } @@ -90,14 +63,9 @@ Alternatively, you can manually configure the MCP server for each client: ```json title="mcp.json" { "better-auth": { - "url": "https://mcp.inkeep.com/better-auth/mcp" + "url": "https://context7.com/better-auth/better-auth" } } ``` - - -We provide a firstโ€‘party MCP, powered by [Inkeep](https://inkeep.com). You can alternatively use [`context7`](https://context7.com/) and other MCP providers. - - diff --git a/landing/.env.example b/landing/.env.example index 9abf53a3f25..dc3a99420ef 100644 --- a/landing/.env.example +++ b/landing/.env.example @@ -1,8 +1,12 @@ # GitHub API - community stats GITHUB_TOKEN= -# Inkeep API - AI chat -INKEEP_API_KEY= +# Openrouter API - docs AI chat +OPENROUTER_API_KEY= + +# Upstash Redis - AI chat rate limiting +UPSTASH_REDIS_REST_URL= +UPSTASH_REDIS_REST_TOKEN= # Typesense - Docs search NEXT_PUBLIC_TYPESENSE_SERVER_URL= @@ -11,3 +15,4 @@ TYPESENSE_ADMIN_API_KEY= # Next.js - public URL NEXT_PUBLIC_URL=http://localhost:3000 + diff --git a/landing/app/api/docs/chat/route.ts b/landing/app/api/docs/chat/route.ts index b3bcd631890..e0ea8b3f56c 100644 --- a/landing/app/api/docs/chat/route.ts +++ b/landing/app/api/docs/chat/route.ts @@ -1,21 +1 @@ -import { createOpenAICompatible } from "@ai-sdk/openai-compatible"; -import { convertToModelMessages, streamText } from "ai"; - -const inkeep = createOpenAICompatible({ - name: "inkeep", - baseURL: "https://api.inkeep.com/v1", - apiKey: process.env.INKEEP_API_KEY, -}); - -export async function POST(req: Request) { - const { messages } = await req.json(); - - const result = streamText({ - model: inkeep.chatModel("inkeep-qa-expert"), - messages: await convertToModelMessages(messages, { - ignoreIncompleteToolCalls: true, - }), - }); - - return result.toUIMessageStreamResponse(); -} +export { POST } from "@/lib/ai-chat/route"; diff --git a/landing/components/ai-chat.tsx b/landing/components/ai-chat.tsx index 6319ed7905e..4b9d086a3cf 100644 --- a/landing/components/ai-chat.tsx +++ b/landing/components/ai-chat.tsx @@ -183,15 +183,7 @@ function MobileDrawerPanel() {
AI Chat - Powered by{" "} - - Inkeep AI - + Better Auth docs assistant

AI Chat

- Powered by{" "} - - Inkeep AI - + Better Auth docs assistant

{/* Scrollable navigation area */} - - {/* Footer: GitHub + Theme Toggle */} -
- - - - - -
- -
-
); } @@ -210,7 +193,7 @@ function BranchSwitcher() {
{/* Scrollable navigation area */} + + {/* Footer: GitHub + Theme Toggle */} +
+ + + + + +
+ +
+
); } @@ -192,15 +209,15 @@ function BranchSwitcher() { }; return ( -
+
- - {error &&

Error: {error.message}

}
); } ``` +### Wallet Creation (Solana) + +Create an embedded Solana wallet using `useSolanaEmbeddedWallet`: + +```tsx +import { useSolanaEmbeddedWallet } from "@openfort/react/solana"; +import { RecoveryMethod } from "@openfort/react"; + +export default function CreateSolanaWallet() { + const { status, create, activeWallet } = useSolanaEmbeddedWallet(); + + if (status === "connected" && activeWallet) { + return
Solana Wallet: {activeWallet.address}
; + } + + return ( + + ); +} +``` + + + Solana requires the `@solana/kit` peer dependency and `solana` config in `walletConfig`. + + ### Sign Messages Sign messages using Wagmi hooks: @@ -394,24 +483,22 @@ export default function MintTokens() { ### Access User Information -Get user and wallet information: +Get user and wallet information using `useUser`: ```tsx import { useUser } from "@openfort/react"; -import { useAccount } from "wagmi"; export default function UserProfile() { - const { user } = useUser(); - const { address, isConnected } = useAccount(); + const { user, isAuthenticated, isConnected, linkedAccounts } = useUser(); - if (!isConnected) { - return

No wallet connected

; + if (!isAuthenticated) { + return

Not authenticated

; } return (
-

Welcome, {user?.player?.name || user?.linkedAccounts[0]?.email}

-

Wallet Address: {address}

+

Welcome, {user?.player?.name || linkedAccounts?.[0]?.email}

+

Connected: {isConnected ? "Yes" : "No"}

); } @@ -445,13 +532,22 @@ interface EncryptionSessionConfig { ```ts interface OpenfortProviderProps { publishableKey: string; // Openfort publishable key - walletConfig: { + walletConfig?: { shieldPublishableKey: string; // Shield publishable key - ethereumProviderPolicyId?: string; // Policy ID for gas sponsorship - getEncryptionSession: () => Promise; // Retrieve encryption session ID - recoverWalletAutomaticallyAfterAuth?: boolean; // Auto-recover wallet after auth (default: false) + connectOnLogin?: boolean; // Auto-recover/create wallet after auth (default: true) + passkeyDisplayName?: string; // Display name for passkey prompts + // Encryption session (pick one): + getEncryptionSession?: (params: { + accessToken: string; + otpCode?: string; + userId: string; + }) => Promise; + createEncryptedSessionEndpoint?: string; // Or provide an API endpoint + // Chain-specific config: + ethereum?: EthereumConfig; // EVM chain settings (chainId, rpcUrls, policyId) + solana?: SolanaConfig; // Solana cluster and RPC settings }; - thirdPartyAuth: { + thirdPartyAuth?: { getAccessToken: () => Promise; // Retrieve Better Auth token provider: ThirdPartyOAuthProvider; // Authentication provider type }; @@ -471,30 +567,21 @@ Openfort supports three wallet recovery methods: - **Password**: User-defined password for recovery ```tsx -import { RecoveryMethod, useWallets } from "@openfort/react"; +import { useEthereumEmbeddedWallet } from "@openfort/react/ethereum"; +import { RecoveryMethod } from "@openfort/react"; -const { createWallet } = useWallets(); +const { create } = useEthereumEmbeddedWallet(); // Passkey recovery -createWallet({ - recovery: { - recoveryMethod: RecoveryMethod.PASSKEY, - }, -}); +create({ recoveryMethod: RecoveryMethod.PASSKEY }); // Automatic recovery -createWallet({ - recovery: { - recoveryMethod: RecoveryMethod.AUTOMATIC, - }, -}); +create({ recoveryMethod: RecoveryMethod.AUTOMATIC }); // Password recovery -createWallet({ - recovery: { - recoveryMethod: RecoveryMethod.PASSWORD, - password: "your-secure-password", - }, +create({ + recoveryMethod: RecoveryMethod.PASSWORD, + password: "your-secure-password", }); ``` From cb240b600d14a10aad9c7e9263f96f6e675cb7ba Mon Sep 17 00:00:00 2001 From: Andreas Osberghaus <148758+mrgrauel@users.noreply.github.com> Date: Thu, 12 Mar 2026 23:07:10 +0100 Subject: [PATCH 56/88] feat(magic-link): add request metadata to sendMagicLink (#8571) --- docs/content/docs/plugins/magic-link.mdx | 7 ++++- .../better-auth/src/client/client.test.ts | 31 +++++++++++++++++++ .../src/plugins/magic-link/index.ts | 10 +++++- .../src/plugins/magic-link/magic-link.test.ts | 18 +++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) diff --git a/docs/content/docs/plugins/magic-link.mdx b/docs/content/docs/plugins/magic-link.mdx index 40c59e342e8..dcfe64aeaee 100644 --- a/docs/content/docs/plugins/magic-link.mdx +++ b/docs/content/docs/plugins/magic-link.mdx @@ -20,7 +20,7 @@ Magic link or email link is a way to authenticate users without a password. When export const auth = betterAuth({ plugins: [ magicLink({ // [!code highlight] - sendMagicLink: async ({ email, token, url }, ctx) => { // [!code highlight] + sendMagicLink: async ({ email, token, url, metadata }, ctx) => { // [!code highlight] // send email to user // [!code highlight] } // [!code highlight] }) // [!code highlight] @@ -85,6 +85,10 @@ type signInMagicLink = { * redirected to the callbackURL with an `error` query parameter. */ errorCallbackURL?: string = "/error" + /** + * Additional metadata forwarded to the sendMagicLink callback. + */ + metadata?: Record = { inviteId: "123" } } ``` @@ -130,6 +134,7 @@ type magicLinkVerify = { - `email`: The email address of the user. - `url`: The URL to be sent to the user. This URL contains the token. - `token`: The token if you want to send the token with custom URL. +- `metadata`: Additional request metadata passed from `signIn.magicLink`. and a `ctx` context object as the second parameter. diff --git a/packages/better-auth/src/client/client.test.ts b/packages/better-auth/src/client/client.test.ts index e18ebe6b5bf..2c42a8aec7d 100644 --- a/packages/better-auth/src/client/client.test.ts +++ b/packages/better-auth/src/client/client.test.ts @@ -12,6 +12,7 @@ import { deviceAuthorizationClient, emailOTPClient, genericOAuthClient, + magicLinkClient, multiSessionClient, oidcClient, organizationClient, @@ -270,6 +271,36 @@ describe("type", () => { expectTypeOf(client.test.signOut).toEqualTypeOf<() => Promise>(); }); + it("should infer magic link metadata in sign-in request", () => { + const client = createReactClient({ + plugins: [magicLinkClient()], + }); + + type SignInMagicLinkInput = NonNullable< + Parameters[0] + >; + + expectTypeOf().toMatchTypeOf<{ + email: string; + name?: string | undefined; + callbackURL?: string | undefined; + newUserCallbackURL?: string | undefined; + errorCallbackURL?: string | undefined; + metadata?: Record | undefined; + }>(); + + const request: SignInMagicLinkInput = { + email: "test@email.com", + metadata: { + inviteId: "123", + }, + }; + + expectTypeOf(request.metadata).toEqualTypeOf< + Record | undefined + >(); + }); + it("should infer session", () => { const client = createSolidClient({ plugins: [testClientPlugin(), testClientPlugin2(), twoFactorClient()], diff --git a/packages/better-auth/src/plugins/magic-link/index.ts b/packages/better-auth/src/plugins/magic-link/index.ts index 891f01463b5..38e5ae64d5d 100644 --- a/packages/better-auth/src/plugins/magic-link/index.ts +++ b/packages/better-auth/src/plugins/magic-link/index.ts @@ -39,6 +39,7 @@ export interface MagicLinkOptions { email: string; url: string; token: string; + metadata?: Record; }, ctx?: GenericEndpointContext | undefined, ) => Awaitable; @@ -112,6 +113,12 @@ const signInMagicLinkBodySchema = z.object({ description: "URL to redirect after error.", }) .optional(), + metadata: z + .record(z.string(), z.any()) + .meta({ + description: "Additional metadata to pass to sendMagicLink.", + }) + .optional(), }); const magicLinkVerifyQuerySchema = z.object({ token: z.string().meta({ @@ -208,7 +215,7 @@ export const magicLink = (options: MagicLinkOptions) => { }, }, async (ctx) => { - const { email } = ctx.body; + const { email, metadata } = ctx.body; const verificationToken = opts?.generateToken ? await opts.generateToken(email) @@ -243,6 +250,7 @@ export const magicLink = (options: MagicLinkOptions) => { email, url: url.toString(), token: verificationToken, + metadata, }, ctx, ); diff --git a/packages/better-auth/src/plugins/magic-link/magic-link.test.ts b/packages/better-auth/src/plugins/magic-link/magic-link.test.ts index b8dfe221047..5d6e3cbb5a8 100644 --- a/packages/better-auth/src/plugins/magic-link/magic-link.test.ts +++ b/packages/better-auth/src/plugins/magic-link/magic-link.test.ts @@ -9,6 +9,7 @@ type VerificationEmail = { email: string; token: string; url: string; + metadata?: Record; }; describe("magic link", async () => { @@ -50,6 +51,23 @@ describe("magic link", async () => { "http://localhost:3000/api/auth/magic-link/verify", ), }); + expect(verificationEmail.metadata).toBeUndefined(); + }); + + it("should forward metadata to sendMagicLink", async () => { + await client.signIn.magicLink({ + email: testUser.email, + metadata: { + inviteId: "123", + }, + }); + + expect(verificationEmail).toMatchObject({ + email: testUser.email, + metadata: { + inviteId: "123", + }, + }); }); it("should verify magic link", async () => { const headers = new Headers(); From 6be0f95991e5ba9b1b61fc6b66df3cc88a26fa51 Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Fri, 13 Mar 2026 07:27:44 +0900 Subject: [PATCH 57/88] feat(test-utils): export adapter test suites from `@better-auth/test-utils/adapter` (#8564) --- e2e/adapter/test/adapter-factory/index.ts | 15 +++++++++------ packages/test-utils/src/adapter/index.ts | 1 + .../test-utils/src/adapter/suites}/auth-flow.ts | 2 +- .../test-utils/src/adapter/suites}/basic.ts | 2 +- packages/test-utils/src/adapter/suites/index.ts | 6 ++++++ .../test-utils/src/adapter/suites}/joins.ts | 2 +- .../test-utils/src/adapter/suites}/number-id.ts | 7 ++----- .../src/adapter/suites}/transactions.ts | 2 +- .../test-utils/src/adapter/suites}/uuid.ts | 2 +- 9 files changed, 23 insertions(+), 16 deletions(-) rename {e2e/adapter/test/adapter-factory => packages/test-utils/src/adapter/suites}/auth-flow.ts (98%) rename {e2e/adapter/test/adapter-factory => packages/test-utils/src/adapter/suites}/basic.ts (99%) create mode 100644 packages/test-utils/src/adapter/suites/index.ts rename {e2e/adapter/test/adapter-factory => packages/test-utils/src/adapter/suites}/joins.ts (89%) rename {e2e/adapter/test/adapter-factory => packages/test-utils/src/adapter/suites}/number-id.ts (83%) rename {e2e/adapter/test/adapter-factory => packages/test-utils/src/adapter/suites}/transactions.ts (95%) rename {e2e/adapter/test/adapter-factory => packages/test-utils/src/adapter/suites}/uuid.ts (96%) diff --git a/e2e/adapter/test/adapter-factory/index.ts b/e2e/adapter/test/adapter-factory/index.ts index c60974851e9..5846aa74f81 100644 --- a/e2e/adapter/test/adapter-factory/index.ts +++ b/e2e/adapter/test/adapter-factory/index.ts @@ -1,6 +1,9 @@ -export * from "./auth-flow"; -export * from "./basic"; -export * from "./joins"; -export * from "./number-id"; -export * from "./transactions"; -export * from "./uuid"; +export { + authFlowTestSuite, + getNormalTestSuiteTests, + joinsTestSuite, + normalTestSuite, + numberIdTestSuite, + transactionsTestSuite, + uuidTestSuite, +} from "@better-auth/test-utils/adapter"; diff --git a/packages/test-utils/src/adapter/index.ts b/packages/test-utils/src/adapter/index.ts index e309ce0b1d0..401b4caab5b 100644 --- a/packages/test-utils/src/adapter/index.ts +++ b/packages/test-utils/src/adapter/index.ts @@ -4,4 +4,5 @@ export { type TestEntry, type TestSuiteStats, } from "./create-test-suite"; +export * from "./suites"; export { type Logger, testAdapter } from "./test-adapter"; diff --git a/e2e/adapter/test/adapter-factory/auth-flow.ts b/packages/test-utils/src/adapter/suites/auth-flow.ts similarity index 98% rename from e2e/adapter/test/adapter-factory/auth-flow.ts rename to packages/test-utils/src/adapter/suites/auth-flow.ts index 0fb91c834c6..60c9ba8921e 100644 --- a/e2e/adapter/test/adapter-factory/auth-flow.ts +++ b/packages/test-utils/src/adapter/suites/auth-flow.ts @@ -1,7 +1,7 @@ import type { Session, User } from "@better-auth/core/db"; -import { createTestSuite } from "@better-auth/test-utils/adapter"; import { setCookieToHeader } from "better-auth/cookies"; import { expect } from "vitest"; +import { createTestSuite } from "../create-test-suite"; /** * This test suite tests basic authentication flow using the adapter. diff --git a/e2e/adapter/test/adapter-factory/basic.ts b/packages/test-utils/src/adapter/suites/basic.ts similarity index 99% rename from e2e/adapter/test/adapter-factory/basic.ts rename to packages/test-utils/src/adapter/suites/basic.ts index 1654a2550a5..6ccedfbe405 100644 --- a/e2e/adapter/test/adapter-factory/basic.ts +++ b/packages/test-utils/src/adapter/suites/basic.ts @@ -5,7 +5,6 @@ import type { User, Verification, } from "@better-auth/core/db"; -import { createTestSuite } from "@better-auth/test-utils/adapter"; import type { Invitation, Member, @@ -14,6 +13,7 @@ import type { } from "better-auth/plugins/organization"; import { organization } from "better-auth/plugins/organization"; import { expect } from "vitest"; +import { createTestSuite } from "../create-test-suite"; /** * This test suite tests the basic CRUD operations of the adapter. diff --git a/packages/test-utils/src/adapter/suites/index.ts b/packages/test-utils/src/adapter/suites/index.ts new file mode 100644 index 00000000000..c60974851e9 --- /dev/null +++ b/packages/test-utils/src/adapter/suites/index.ts @@ -0,0 +1,6 @@ +export * from "./auth-flow"; +export * from "./basic"; +export * from "./joins"; +export * from "./number-id"; +export * from "./transactions"; +export * from "./uuid"; diff --git a/e2e/adapter/test/adapter-factory/joins.ts b/packages/test-utils/src/adapter/suites/joins.ts similarity index 89% rename from e2e/adapter/test/adapter-factory/joins.ts rename to packages/test-utils/src/adapter/suites/joins.ts index 533d5297594..974c07a0ed0 100644 --- a/e2e/adapter/test/adapter-factory/joins.ts +++ b/packages/test-utils/src/adapter/suites/joins.ts @@ -1,5 +1,5 @@ -import { createTestSuite } from "@better-auth/test-utils/adapter"; import { expect } from "vitest"; +import { createTestSuite } from "../create-test-suite"; import { getNormalTestSuiteTests } from "./basic"; export const joinsTestSuite = createTestSuite( diff --git a/e2e/adapter/test/adapter-factory/number-id.ts b/packages/test-utils/src/adapter/suites/number-id.ts similarity index 83% rename from e2e/adapter/test/adapter-factory/number-id.ts rename to packages/test-utils/src/adapter/suites/number-id.ts index d2881c9fb0b..0a819cfc110 100644 --- a/e2e/adapter/test/adapter-factory/number-id.ts +++ b/packages/test-utils/src/adapter/suites/number-id.ts @@ -1,6 +1,6 @@ -import { createTestSuite } from "@better-auth/test-utils/adapter"; import type { User } from "better-auth/types"; import { expect } from "vitest"; +import { createTestSuite } from "../create-test-suite"; import { getNormalTestSuiteTests } from "./basic"; export const numberIdTestSuite = createTestSuite( @@ -23,10 +23,7 @@ export const numberIdTestSuite = createTestSuite( return { "init - tests": async () => { const opts = helpers.getBetterAuthOptions(); - expect( - opts.advanced?.database?.useNumberId || - opts.advanced?.database?.generateId === "serial", - ).toBe(true); + expect(opts.advanced?.database?.generateId === "serial").toBe(true); }, "create - should return a number id": async () => { const user = await helpers.generate("user"); diff --git a/e2e/adapter/test/adapter-factory/transactions.ts b/packages/test-utils/src/adapter/suites/transactions.ts similarity index 95% rename from e2e/adapter/test/adapter-factory/transactions.ts rename to packages/test-utils/src/adapter/suites/transactions.ts index 1b08d03bf2e..54275393e88 100644 --- a/e2e/adapter/test/adapter-factory/transactions.ts +++ b/packages/test-utils/src/adapter/suites/transactions.ts @@ -1,6 +1,6 @@ -import { createTestSuite } from "@better-auth/test-utils/adapter"; import type { User } from "better-auth/db"; import { expect } from "vitest"; +import { createTestSuite } from "../create-test-suite"; /** * This test suite tests the transaction functionality of the adapter. diff --git a/e2e/adapter/test/adapter-factory/uuid.ts b/packages/test-utils/src/adapter/suites/uuid.ts similarity index 96% rename from e2e/adapter/test/adapter-factory/uuid.ts rename to packages/test-utils/src/adapter/suites/uuid.ts index 1112f80c4e6..31c18430184 100644 --- a/e2e/adapter/test/adapter-factory/uuid.ts +++ b/packages/test-utils/src/adapter/suites/uuid.ts @@ -1,6 +1,6 @@ import type { User } from "@better-auth/core/db"; -import { createTestSuite } from "@better-auth/test-utils/adapter"; import { expect } from "vitest"; +import { createTestSuite } from "../create-test-suite"; import { getNormalTestSuiteTests } from "./basic"; export const uuidTestSuite = createTestSuite( From 331c4c4136fde110d61bb260b7998fa0e66c4cbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A9l=20Solano?= Date: Thu, 12 Mar 2026 23:57:58 +0100 Subject: [PATCH 58/88] fix: handle `skipOriginCheck` array (#8582) --- .../src/api/middlewares/origin-check.test.ts | 55 +++++++++++++++++++ .../src/api/middlewares/origin-check.ts | 43 +++++++++------ 2 files changed, 82 insertions(+), 16 deletions(-) diff --git a/packages/better-auth/src/api/middlewares/origin-check.test.ts b/packages/better-auth/src/api/middlewares/origin-check.test.ts index c037fbc34da..004b5c7651b 100644 --- a/packages/better-auth/src/api/middlewares/origin-check.test.ts +++ b/packages/better-auth/src/api/middlewares/origin-check.test.ts @@ -537,6 +537,61 @@ describe("origin check middleware", async () => { ); expect(sampleInternalEndpointInvalid.error?.status).toBe(403); }); + + it("should skip origin check for matched paths when skipOriginCheck is set to an array", async () => { + const { client } = await getTestInstance({ + trustedOrigins: ["https://trusted-site.com"], + advanced: { + disableOriginCheck: false, + }, + plugins: [ + { + id: "test", + init() { + return { + context: { + skipOriginCheck: ["/public/data"], + }, + }; + }, + endpoints: { + publicEndpoint: createAuthEndpoint( + "/public/data", + { + method: "GET", + query: z.object({ + callbackURL: z.string(), + }), + use: [originCheck((c) => c.query.callbackURL)], + }, + async (c) => c.query.callbackURL, + ), + protectedEndpoint: createAuthEndpoint( + "/protected/data", + { + method: "GET", + query: z.object({ + callbackURL: z.string(), + }), + use: [originCheck((c) => c.query.callbackURL)], + }, + async (c) => c.query.callbackURL, + ), + }, + }, + ], + }); + + const skipped = await client.$fetch( + "/public/data?callbackURL=https://malicious.com", + ); + expect(skipped.data).toBe("https://malicious.com"); + + const blocked = await client.$fetch( + "/protected/data?callbackURL=https://malicious.com", + ); + expect(blocked.error?.status).toBe(403); + }); }); describe("trusted origins with baseURL inferred from request", async () => { diff --git a/packages/better-auth/src/api/middlewares/origin-check.ts b/packages/better-auth/src/api/middlewares/origin-check.ts index 9010cccaa94..921a69e5098 100644 --- a/packages/better-auth/src/api/middlewares/origin-check.ts +++ b/packages/better-auth/src/api/middlewares/origin-check.ts @@ -18,6 +18,29 @@ function shouldSkipCSRFForBackwardCompat(ctx: GenericEndpointContext): boolean { ); } +/** + * Checks if the origin check should be skipped for the current request. + * Handles both boolean (skip all) and array (skip specific paths) configurations. + */ +function shouldSkipOriginCheck(ctx: GenericEndpointContext): boolean { + const skipOriginCheck = ctx.context.skipOriginCheck; + if (skipOriginCheck === true) { + return true; + } + if (Array.isArray(skipOriginCheck) && ctx.request) { + try { + const basePath = new URL(ctx.context.baseURL).pathname; + const currentPath = normalizePathname(ctx.request.url, basePath); + return skipOriginCheck.some((skipPath) => + currentPath.startsWith(skipPath), + ); + } catch { + // + } + } + return false; +} + /** * Logs deprecation warning for users relying on coupled behavior. * Only logs if user explicitly set disableOriginCheck (not test environment default). @@ -45,7 +68,7 @@ export const originCheckMiddleware = createAuthMiddleware(async (ctx) => { } await validateOrigin(ctx); - if (ctx.context.skipOriginCheck) { + if (shouldSkipOriginCheck(ctx)) { return; } @@ -117,7 +140,7 @@ export const originCheck = ( if (!ctx.request) { return; } - if (ctx.context.skipOriginCheck) { + if (shouldSkipOriginCheck(ctx)) { return; } const callbackURL = getValue(ctx); @@ -199,20 +222,8 @@ async function validateOrigin( return; } - const skipOriginCheck = ctx.context.skipOriginCheck; - if (Array.isArray(skipOriginCheck)) { - try { - const basePath = new URL(ctx.context.baseURL).pathname; - const currentPath = normalizePathname(ctx.request.url, basePath); - const shouldSkipPath = skipOriginCheck.some((skipPath) => - currentPath.startsWith(skipPath), - ); - if (shouldSkipPath) { - return; - } - } catch { - // If parsing fails, don't skip - continue with validation - } + if (shouldSkipOriginCheck(ctx)) { + return; } const shouldValidate = forceValidate || useCookies; From 3270499c08aa93f5849f9eb504658ea278481d55 Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Fri, 13 Mar 2026 08:02:26 +0900 Subject: [PATCH 59/88] fix(stripe): replace `{CHECKOUT_SESSION_ID}` placeholder in success callbackURL (#8568) --- packages/stripe/src/routes.ts | 11 ++- packages/stripe/test/stripe.test.ts | 128 ++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 1 deletion(-) diff --git a/packages/stripe/src/routes.ts b/packages/stripe/src/routes.ts index 6e751f5728e..56f276a3636 100644 --- a/packages/stripe/src/routes.ts +++ b/packages/stripe/src/routes.ts @@ -1640,7 +1640,7 @@ export const subscriptionSuccess = (options: StripeOptions) => { use: [originCheck((ctx) => ctx.query.callbackURL)], }, async (ctx) => { - const callbackURL = ctx.query?.callbackURL || "/"; + let callbackURL = ctx.query?.callbackURL || "/"; const session = await getSessionFromCtx(ctx); if (!session) { @@ -1653,6 +1653,15 @@ export const subscriptionSuccess = (options: StripeOptions) => { throw ctx.redirect(getUrl(ctx, callbackURL)); } + /** + * Replace the Stripe {CHECKOUT_SESSION_ID} template variable in callbackURL. + * @see https://docs.stripe.com/payments/checkout/custom-success-page?payment-ui=stripe-hosted#modify-the-success-url + */ + callbackURL = callbackURL.replaceAll( + "{CHECKOUT_SESSION_ID}", + ctx.query.checkoutSessionId, + ); + // Resolve subscriptionId from Stripe checkout session metadata. // The metadata is set server-side when creating the checkout session, // so it cannot be tampered with โ€” no ownership check needed. diff --git a/packages/stripe/test/stripe.test.ts b/packages/stripe/test/stripe.test.ts index 2089eff761f..1ba291889d3 100644 --- a/packages/stripe/test/stripe.test.ts +++ b/packages/stripe/test/stripe.test.ts @@ -7481,6 +7481,134 @@ describe("stripe", () => { expect(response.headers.get("location")).toContain(callbackURL); }); + /** + * @see https://github.com/better-auth/better-auth/issues/8255 + */ + it("should replace {CHECKOUT_SESSION_ID} placeholder in callbackURL with actual session ID", async () => { + const testSubscriptionId = "sub_placeholder_test"; + const testCheckoutSessionId = "cs_placeholder_456"; + const testCustomerId = "cus_placeholder_test"; + + const stripeForTest = { + ...stripeOptions.stripeClient, + checkout: { + sessions: { + ...stripeOptions.stripeClient.checkout.sessions, + retrieve: vi.fn(), + }, + }, + subscriptions: { + ...stripeOptions.stripeClient.subscriptions, + list: vi.fn().mockResolvedValue({ + data: [ + { + id: testSubscriptionId, + status: "active", + cancel_at_period_end: false, + cancel_at: null, + canceled_at: null, + trial_start: null, + trial_end: null, + items: { + data: [ + { + price: { + id: process.env.STRIPE_PRICE_ID_1, + recurring: { interval: "month" }, + }, + quantity: 1, + current_period_start: Math.floor(Date.now() / 1000), + current_period_end: + Math.floor(Date.now() / 1000) + 30 * 86400, + }, + ], + }, + }, + ], + }), + }, + }; + + const testOptions = { + ...stripeOptions, + stripeClient: stripeForTest as unknown as Stripe, + }; + + const { + client, + auth: testAuth, + sessionSetter, + } = await getTestInstance( + { + database: memory, + plugins: [stripe(testOptions)], + }, + { + disableTestUser: true, + clientOptions: { + plugins: [stripeClient({ subscription: true })], + }, + }, + ); + const testCtx = await testAuth.$context; + + const headers = new Headers(); + const userRes = await client.signUp.email( + { + email: "placeholder-test@test.com", + password: "password", + name: "Placeholder Test", + }, + { throw: true }, + ); + await client.signIn.email( + { email: "placeholder-test@test.com", password: "password" }, + { throw: true, onSuccess: sessionSetter(headers) }, + ); + + const sub = await testCtx.adapter.create({ + model: "subscription", + data: { + referenceId: userRes.user.id, + stripeCustomerId: testCustomerId, + status: "incomplete", + plan: "starter", + }, + }); + + (stripeForTest.checkout.sessions.retrieve as any).mockResolvedValue({ + id: testCheckoutSessionId, + metadata: { + userId: userRes.user.id, + subscriptionId: sub.id, + referenceId: userRes.user.id, + }, + }); + + // User passes {CHECKOUT_SESSION_ID} in their successUrl, which gets + // URL-encoded inside callbackURL. Stripe can only replace the literal + // (unencoded) placeholder, so the encoded version stays as-is. + // Better Auth should replace it with the actual session ID before redirecting. + const callbackURL = + "http://localhost:5173/billing/success?session_id={CHECKOUT_SESSION_ID}"; + const url = `http://localhost:3000/api/auth/subscription/success?callbackURL=${encodeURIComponent(callbackURL)}&checkoutSessionId=${testCheckoutSessionId}`; + const response = await testAuth.handler( + new Request(url, { + method: "GET", + headers, + redirect: "manual", + }), + ); + + expect(response.status).toBe(302); + const location = response.headers.get("location")!; + // The placeholder must be replaced with the actual checkout session ID + expect(location).toContain(`session_id=${testCheckoutSessionId}`); + // The literal placeholder must NOT remain in the redirect URL + expect(location).not.toContain("{CHECKOUT_SESSION_ID}"); + expect(location).not.toContain("%7BCHECKOUT_SESSION_ID%7D"); + }); + it("should redirect when checkout session retrieval fails", async () => { const stripeForTest = { ...stripeOptions.stripeClient, From 4c005eaf050f0a0f8eb47e4c2fe12e14dad7af6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Masum=20G=C3=B6ky=C3=BCz?= <121493635+periakteon@users.noreply.github.com> Date: Fri, 13 Mar 2026 02:06:20 +0300 Subject: [PATCH 60/88] docs: enhance Upstash Redis secondary storage implementation (#3895) Co-authored-by: Alex Yang Co-authored-by: Maxwell <145994855+ping-maxwell@users.noreply.github.com> --- docs/content/docs/concepts/database.mdx | 103 +++++++++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/docs/content/docs/concepts/database.mdx b/docs/content/docs/concepts/database.mdx index af4a4d8c01d..068718f6470 100644 --- a/docs/content/docs/concepts/database.mdx +++ b/docs/content/docs/concepts/database.mdx @@ -214,6 +214,104 @@ export const auth = betterAuth({ This implementation allows Better Auth to use Redis for storing session data and rate limiting counters. You can also add prefixes to the keys names. +**Example: Upstash Redis Implementation** + +Here's an example using Upstash Redis. First, install the Upstash Redis client: + +```bash +npm install @upstash/redis +``` + +Then, create a new Redis client: + +```typescript +// src/lib/redis/index.ts + +import { Redis } from "@upstash/redis"; + +export const redis = Redis.fromEnv(); +``` + +Don't forget to set the `UPSTASH_REDIS_REST_URL` and `UPSTASH_REDIS_REST_TOKEN` environment variables. Also, [see the Upstash documentation](https://upstash.com/docs/redis/howto/connectwithupstashredis) for more information on how to use Upstash Redis with Node.js. + +After that, we can create a secondary storage implementation: + +```typescript +// src/lib/auth/adapters/redis-secondary-storage.ts + +import { SecondaryStorage } from "better-auth"; +import { redis } from "~/lib/redis"; + +export const redisSecondaryStorage: SecondaryStorage = { + async get(key: string) { + try { + const value = await redis.get(key); + + // Handle different return types from Redis + if (value === null || value === undefined) { + return null; + } + + // If it's already a string, return it + if (typeof value === "string") { + return value; + } + + // If it's an object, stringify it + if (typeof value === "object") { + return JSON.stringify(value); + } + + // Convert to string for any other type + return String(value); + } catch (error) { + console.error("Redis get error:", error); + return null; + } + }, + + async set(key: string, value: string, ttl?: number) { + try { + // Ensure value is a string + const stringValue = + typeof value === "string" ? value : JSON.stringify(value); + + if (ttl) { + // Set with TTL in seconds + await redis.setex(key, ttl, stringValue); + } else { + // Set without TTL + await redis.set(key, stringValue); + } + } catch (error) { + console.error("Redis set error:", error); + throw error; + } + }, + + async delete(key: string) { + try { + await redis.del(key); + } catch (error) { + console.error("Redis delete error:", error); + throw error; + } + }, +}; +``` + +Finally, we can pass the implementation to the `betterAuth` function. + +```typescript +import { betterAuth } from "better-auth"; +import { redisSecondaryStorage } from "~/lib/auth/adapters/redis-secondary-storage"; + +export const auth = betterAuth({ + // ... other options + secondaryStorage: redisSecondaryStorage, +}); +``` + ## Core Schema Better Auth requires the following tables to be present in the database. The types are in `typescript` format. You can use corresponding types in your database. @@ -860,7 +958,10 @@ export const auth = betterAuth({ before: async (data, ctx) => { // You can access the session from the context object. if (ctx.context.session) { - console.log("User update initiated by:", ctx.context.session.userId); + console.log( + "User update initiated by:", + ctx.context.session.userId + ); } return { data }; }, From 5c0c87ce7f0eb8911d1dfdbbaa1fb2651a0605ab Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Fri, 13 Mar 2026 12:42:37 -0700 Subject: [PATCH 61/88] fix(docs): improve AI chat security and cleanup (#8597) --- .cspell/custom-words.txt | 2 +- .cspell/tech-terms.txt | 2 +- landing/lib/ai-chat/rate-limit.ts | 34 +- landing/lib/ai-chat/route.ts | 17 +- landing/package.json | 1 - pnpm-lock.yaml | 3585 +---------------------------- turbo.json | 8 +- 7 files changed, 70 insertions(+), 3579 deletions(-) diff --git a/.cspell/custom-words.txt b/.cspell/custom-words.txt index c7a994c7a18..ec455a40502 100644 --- a/.cspell/custom-words.txt +++ b/.cspell/custom-words.txt @@ -14,4 +14,4 @@ uncompromised myapp Neue CCPA -CPRA \ No newline at end of file +CPRA diff --git a/.cspell/tech-terms.txt b/.cspell/tech-terms.txt index baa270f7c15..3efd48baca4 100644 --- a/.cspell/tech-terms.txt +++ b/.cspell/tech-terms.txt @@ -49,4 +49,4 @@ sess reactivations whsec moonshotai -kimi \ No newline at end of file +kimi diff --git a/landing/lib/ai-chat/rate-limit.ts b/landing/lib/ai-chat/rate-limit.ts index 1cb9e99d0a9..6cef95d4440 100644 --- a/landing/lib/ai-chat/rate-limit.ts +++ b/landing/lib/ai-chat/rate-limit.ts @@ -1,29 +1,35 @@ import { Ratelimit } from "@upstash/ratelimit"; import { Redis } from "@upstash/redis"; -const redis = new Redis({ - url: process.env.UPSTASH_REDIS_REST_URL!, - token: process.env.UPSTASH_REDIS_REST_TOKEN!, -}); - -const ratelimit = new Ratelimit({ - redis, - limiter: Ratelimit.slidingWindow(20, "10 m"), - prefix: "ai-chat", -}); +let _ratelimit: Ratelimit | null = null; +function getRatelimit(): Ratelimit { + if (!_ratelimit) { + const redis = new Redis({ + url: process.env.UPSTASH_REDIS_REST_URL!, + token: process.env.UPSTASH_REDIS_REST_TOKEN!, + }); + _ratelimit = new Ratelimit({ + redis, + limiter: Ratelimit.slidingWindow(20, "10 m"), + prefix: "ai-chat", + }); + } + return _ratelimit; +} /** * Extract the real client IP from a Vercel-proxied request. - * Vercel appends the connecting IP as the rightmost value in x-forwarded-for. + * Prefer x-real-ip (set by Vercel, cannot be spoofed by clients), + * then fall back to the first x-forwarded-for entry. */ export function getClientIP(req: Request): string { + const realIp = req.headers.get("x-real-ip"); + if (realIp) return realIp.trim(); const forwarded = req.headers.get("x-forwarded-for"); if (forwarded) { const ips = forwarded.split(",").map((ip) => ip.trim()); return ips[0] || "unknown"; } - const realIp = req.headers.get("x-real-ip"); - if (realIp) return realIp.trim(); return "unknown"; } @@ -36,7 +42,7 @@ export async function checkRateLimit(ip: string) { reset: Date.now() + 1000 * 60 * 10, }; } - const result = await ratelimit.limit(ip); + const result = await getRatelimit().limit(ip); return { success: result.success, limit: result.limit, diff --git a/landing/lib/ai-chat/route.ts b/landing/lib/ai-chat/route.ts index dcab99faa66..3a80ee41050 100644 --- a/landing/lib/ai-chat/route.ts +++ b/landing/lib/ai-chat/route.ts @@ -254,7 +254,22 @@ export async function POST(req: Request) { ); } - const { messages } = await req.json(); + const body = await req.json(); + const messages = body?.messages; + if (!Array.isArray(messages) || messages.length === 0) { + return new Response( + JSON.stringify({ + error: "Invalid request: messages must be a non-empty array.", + }), + { status: 400, headers: { "Content-Type": "application/json" } }, + ); + } + if (messages.length > 100) { + return new Response(JSON.stringify({ error: "Too many messages." }), { + status: 400, + headers: { "Content-Type": "application/json" }, + }); + } const docsIndex = getDocsIndex(); const system = SYSTEM_PROMPT + docsIndex; diff --git a/landing/package.json b/landing/package.json index 2b8dbc263f0..027a5e5fca6 100644 --- a/landing/package.json +++ b/landing/package.json @@ -21,7 +21,6 @@ "@better-fetch/fetch": "^1.1.21", "@biomejs/biome": "2.4.4", "@hookform/resolvers": "^5.2.1", - "@inkeep/ai-sdk-provider": "^0.54.0", "@openrouter/ai-sdk-provider": "^2.2.5", "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-dialog": "^1.1.15", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43da33a9473..872d352e2b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -656,8 +656,8 @@ importers: specifier: ^0.45.1 version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) hono: - specifier: ^4.12.3 - version: 4.12.5 + specifier: ^4.12.7 + version: 4.12.7 devDependencies: '@cloudflare/vitest-pool-workers': specifier: ^0.12.18 @@ -685,14 +685,14 @@ importers: e2e/smoke/test/fixtures/ipv6: dependencies: '@hono/node-server': - specifier: ^1.19.9 - version: 1.19.11(hono@4.12.5) + specifier: ^1.19.10 + version: 1.19.11(hono@4.12.7) better-auth: specifier: workspace:* version: link:../../../../../packages/better-auth hono: - specifier: ^4.12.3 - version: 4.12.5 + specifier: ^4.12.7 + version: 4.12.7 e2e/smoke/test/fixtures/tsconfig-declaration: dependencies: @@ -775,9 +775,6 @@ importers: '@hookform/resolvers': specifier: ^5.2.1 version: 5.2.2(react-hook-form@7.71.2(react@19.2.4)) - '@inkeep/ai-sdk-provider': - specifier: ^0.54.0 - version: 0.54.0(d83c022487f0e4a5f3e31c50322904ae) '@openrouter/ai-sdk-provider': specifier: ^2.2.5 version: 2.2.5(ai@6.0.116(zod@4.3.6))(zod@4.3.6) @@ -1754,18 +1751,6 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@3.0.7': - resolution: {integrity: sha512-WFE56yxgjecd77f8pNj1TkusfCKh34E4h+0J0qVOKDNFXuOsZiAb6dIG9Q3PUrwY1MuiMQLD/9ir0s+dVcVfeA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/azure@3.0.38': - resolution: {integrity: sha512-ihePWrlsSfCz1sB6tkaRErw9w1f26uKncoVYu3EBjFhvuY0tOIOOcMS3649R/she8wPR/cP5n69t6C8BtjZAFA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.59': resolution: {integrity: sha512-MbtheWHgEFV/8HL1Z6E3hOAsmP73zZlNFg0F0nJAD0Adnjp4J/plqNK00Y896d+dWTw+r0OXzyov9/2wCFjH0Q==} engines: {node: '>=18'} @@ -1778,42 +1763,18 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.9': - resolution: {integrity: sha512-EA5dZIukimwoJ9HIPuuREotAqaTItpdc/yImzVF0XGNg7B0YRJmYI8Uq3aCMr87vjr1YB1cWUfnrTt6OJ9eHiQ==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/google@3.0.4': - resolution: {integrity: sha512-2TlnBY0QAL4aYaV7fLdUvs+akTwE6B2l8CKSLpKrJlB0LVqmhXK6uP2CrOuCi/8d0H0q1JTr+avLgd23VNgcLQ==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai-compatible@2.0.30': resolution: {integrity: sha512-iTjumHf1/u4NhjXYFn/aONM2GId3/o7J1Lp5ql8FCbgIMyRwrmanR5xy1S3aaVkfTscuDvLTzWiy1mAbGzK3nQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai-compatible@2.0.4': - resolution: {integrity: sha512-kzsXyybJKM3wtUtGZkNbvmpDwqpsvg/hTjlPZe3s/bCx3enVdAlRtXD853nnj6mZjteNCDLoR2OgVLuDpyRN5Q==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@3.0.37': resolution: {integrity: sha512-bcYjT3/58i/C0DN3AnrjiGsAb0kYivZLWWUtgTjsBurHSht/LTEy+w3dw5XQe3FmZwX7Z/mUQCiA3wB/5Kf7ow==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@3.0.7': - resolution: {integrity: sha512-CBoYn1U59Lop8yBL9KuVjHCKc/B06q9Qo0SasRwHoyMEq+X4I8LQZu3a8Ck1jwwcZTTxfyiExB70LtIRSynBDA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.15': resolution: {integrity: sha512-8XiKWbemmCbvNN0CLR9u3PQiet4gtEVIrX4zzLxnCj06AwsEDJwJVBbKrEI4t6qE8XRSIvU2irka0dcpziKW6w==} engines: {node: '>=18'} @@ -1832,16 +1793,6 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.4': - resolution: {integrity: sha512-VxhX0B/dWGbpNHxrKCWUAJKXIXV015J4e7qYjdIU9lLWeptk0KMLGcqkB4wFxff5Njqur8dt8wRi1MN9lZtDqg==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/provider@3.0.2': - resolution: {integrity: sha512-HrEmNt/BH/hkQ7zpi2o6N3k1ZR1QTb7z85WYhYygiTxOQuaml4CMtHCWRbric5WPU+RNsYI7r1EpyVQMKO1pYw==} - engines: {node: '>=18'} - '@ai-sdk/provider@3.0.8': resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} engines: {node: '>=18'} @@ -1927,18 +1878,10 @@ packages: resolution: {integrity: sha512-GiwTmBFOU1/+UVNqqCGzFJYfBXEytUkiI+iRZ6Qx7KmUVtLm00sYySkfe203C9QtPG11yOz1ZaMek8dT/xnlgg==} engines: {node: '>=20'} - '@asteasolutions/zod-to-openapi@8.4.3': - resolution: {integrity: sha512-lwfMTN7kDbFDwMniYZUebiGGHxVGBw9ZSI4IBYjm6Ey22Kd5z/fsQb2k+Okr8WMbCCC553vi/ZM9utl5/XcvuQ==} - peerDependencies: - zod: ^4.0.0 - '@authenio/xml-encryption@2.0.2': resolution: {integrity: sha512-cTlrKttbrRHEw3W+0/I609A2Matj5JQaRvfLtEIGZvlN0RaPi+3ANsMeqAyCAVlH/lUIW2tmtBlSMni74lcXeg==} engines: {node: '>=12'} - '@authzed/authzed-node@1.6.1': - resolution: {integrity: sha512-Rj3rMtWOjo3igxY/2fpPrIedCTfDq3e+weykuxNBzV/y6azBCoXp8SzpjCEJXVcWyBD8bu/EKY3cye3kOLsKpQ==} - '@azure-rest/core-client@2.5.1': resolution: {integrity: sha512-EHaOXW0RYDKS5CFffnixdyRPak5ytiCtU7uXDcP/uiY+A6jFRwNGzzJBiznkCzvi5EYpY+YWinieqHb0oY916A==} engines: {node: '>=20.0.0'} @@ -2540,31 +2483,6 @@ packages: resolution: {integrity: sha512-ubmJ6TShyaD69VE9DQrlXcdkvJbmwWPB8qYj0H2kaJi29O7vJT9ajSdBd2W8CG34pwL9pYA74fi7RHC1qbLoVQ==} engines: {node: ^20.19.0 || >=22.12.0} - '@better-auth/core@1.4.19': - resolution: {integrity: sha512-uADLHG1jc5BnEJi7f6ijUN5DmPPRSj++7m/G19z3UqA3MVCo4Y4t1MMa4IIxLCqGDFv22drdfxescgW+HnIowA==} - peerDependencies: - '@better-auth/utils': 0.3.0 - '@better-fetch/fetch': 1.1.21 - better-call: 1.1.8 - jose: ^6.1.0 - kysely: ^0.28.5 - nanostores: ^1.0.1 - - '@better-auth/sso@1.4.19': - resolution: {integrity: sha512-4OVPii6DQgIRm/DqO74Q4tZHx0LlNHXif3qrW7/iDzRO507h/AVAoJ9/U2fGycsPxUtPh1BT3PGHfX09sbF9Bw==} - peerDependencies: - '@better-auth/utils': 0.3.0 - better-auth: 1.4.19 - better-call: 1.1.8 - - '@better-auth/telemetry@1.4.19': - resolution: {integrity: sha512-ApGNS7olCTtDpKF8Ow3Z+jvFAirOj7c4RyFUpu8axklh3mH57ndpfUAUjhgA8UVoaaH/mnm/Tl884BlqiewLyw==} - peerDependencies: - '@better-auth/core': 1.4.19 - - '@better-auth/utils@0.3.0': - resolution: {integrity: sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==} - '@better-auth/utils@0.3.1': resolution: {integrity: sha512-+CGp4UmZSUrHHnpHhLPYu6cV+wSUSvVbZbNykxhUDocpVNTo9uFFxw/NqJlh1iC4wQ9HKKWGCKuZ5wUgS0v6Kg==} @@ -2763,19 +2681,6 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@composio/client@0.1.0-alpha.40': - resolution: {integrity: sha512-xkd+LseCiuFLxiXXtjFgON0bO4M/1AsBQD4omhf2nl5tXJI0sXj72wCf1EXhT2jIu5pgJqJ4H64ZzwoM0fHDvg==} - - '@composio/core@0.2.6': - resolution: {integrity: sha512-QQgZz9o0ikl+A38PhyE0/j5V1y5wDDl8z6yfYw/WYAkk7AqjOJI9eJ/eujwgkTWxKnMaxrkthVzsjtvg/KIoYw==} - peerDependencies: - zod: '>=3.25.76 <5' - - '@composio/json-schema-to-zod@0.1.19': - resolution: {integrity: sha512-OynnORVWjsqDv13EvFa4Bb+B1SzBqpkWGi6qXm4vpB3EG65o3T9FbhDCqWB3ZufnMmH1T/NYS526O0lnn2LoCQ==} - peerDependencies: - zod: '>=3.25.76 <4 || >=4.1 <5' - '@cspell/cspell-bundled-dicts@9.7.0': resolution: {integrity: sha512-s7h1vo++Q3AsfQa3cs0u/KGwm3SYInuIlC4kjlCBWjQmb4KddiZB5O1u0+3TlA7GycHb5M4CR7MDfHUICgJf+w==} engines: {node: '>=20'} @@ -3978,15 +3883,6 @@ packages: tailwindcss: optional: true - '@grpc/grpc-js@1.14.3': - resolution: {integrity: sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==} - engines: {node: '>=12.10.0'} - - '@grpc/proto-loader@0.8.0': - resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} - engines: {node: '>=6'} - hasBin: true - '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -4011,19 +3907,6 @@ packages: peerDependencies: hono: ^4 - '@hono/zod-openapi@1.2.2': - resolution: {integrity: sha512-va6vsL23wCJ1d0Vd+vGL1XOt+wPwItxirYafuhlW9iC2MstYr2FvsI7mctb45eBTjZfkqB/3LYDJEppPjOEiHw==} - engines: {node: '>=16.0.0'} - peerDependencies: - hono: '>=4.3.6' - zod: ^4.0.0 - - '@hono/zod-validator@0.7.6': - resolution: {integrity: sha512-Io1B6d011Gj1KknV4rXYz4le5+5EubcWEU/speUjuw9XMMIaP3n78yXLhjd2A3PXaXaUwEAluOiAyLqhBEJgsw==} - peerDependencies: - hono: '>=3.9.0' - zod: ^3.25.0 || ^4.0.0 - '@hookform/resolvers@5.2.2': resolution: {integrity: sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==} peerDependencies: @@ -4188,17 +4071,6 @@ packages: cpu: [x64] os: [win32] - '@inkeep/agents-core@0.54.0': - resolution: {integrity: sha512-zHQ+r0LYhLU/4GvFGOv7BoQGqwAPf61sZDRF/Me460oNuJk1tnh/mKcqDCBG9pRNzA96bujznOReGzVxSIndgw==} - engines: {node: '>=22.18.0'} - peerDependencies: - '@hono/zod-openapi': ^1.1.5 - zod: ^4.3.6 - - '@inkeep/ai-sdk-provider@0.54.0': - resolution: {integrity: sha512-yvYAyiWJJ9/07/H4FnXRqp3kCiKOsFI1FyZJFl2HuqPmoqRtlO0gDryp8b3gDW4SVsqGY2phK31lobI0E+qs1g==} - engines: {node: '>=22.18.0'} - '@inquirer/ansi@1.0.2': resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} engines: {node: '>=18'} @@ -4306,9 +4178,6 @@ packages: '@js-joda/core@5.7.0': resolution: {integrity: sha512-WBu4ULVVxySLLzK1Ppq+OdfP+adRS4ntmDQT915rzDJ++i95gc2jZkM5B6LWEAwN3lGXpfie3yPABozdD3K3Vg==} - '@js-sdsl/ordered-map@4.4.2': - resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@jsonjoy.com/base64@1.1.2': resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} @@ -4544,94 +4413,6 @@ packages: resolution: {integrity: sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==} engines: {node: '>=18'} - '@nangohq/node@0.69.38': - resolution: {integrity: sha512-8Bmt5SPRAXcWg/mcQLP+DZTGir02RsHgXSPHs/KAliyNZX81O/YpCVlr87dSrtzSO1UpMeBk5aKnelMvCAgVEg==} - engines: {node: '>=20.0'} - - '@nangohq/types@0.69.38': - resolution: {integrity: sha512-YHTk4+55PtguG094qOZaRdJ1qXB8wTmffpq6vdQYhGzZJUk9TPRqHA0P5i2FM/ZuOczX6ciHOmUWmqykxHaRog==} - - '@napi-rs/keyring-darwin-arm64@1.2.0': - resolution: {integrity: sha512-CA83rDeyONDADO25JLZsh3eHY8yTEtm/RS6ecPsY+1v+dSawzT9GywBMu2r6uOp1IEhQs/xAfxgybGAFr17lSA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@napi-rs/keyring-darwin-x64@1.2.0': - resolution: {integrity: sha512-dBHjtKRCj4ByfnfqIKIJLo3wueQNJhLRyuxtX/rR4K/XtcS7VLlRD01XXizjpre54vpmObj63w+ZpHG+mGM8uA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@napi-rs/keyring-freebsd-x64@1.2.0': - resolution: {integrity: sha512-DPZFr11pNJSnaoh0dzSUNF+T6ORhy3CkzUT3uGixbA71cAOPJ24iG8e8QrLOkuC/StWrAku3gBnth2XMWOcR3Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@napi-rs/keyring-linux-arm-gnueabihf@1.2.0': - resolution: {integrity: sha512-8xv6DyEMlvRdqJzp4F39RLUmmTQsLcGYYv/3eIfZNZN1O5257tHxTrFYqAsny659rJJK2EKeSa7PhrSibQqRWQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@napi-rs/keyring-linux-arm64-gnu@1.2.0': - resolution: {integrity: sha512-Pu2V6Py+PBt7inryEecirl+t+ti8bhZphjP+W68iVaXHUxLdWmkgL9KI1VkbRHbx5k8K5Tew9OP218YfmVguIA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@napi-rs/keyring-linux-arm64-musl@1.2.0': - resolution: {integrity: sha512-8TDymrpC4P1a9iDEaegT7RnrkmrJN5eNZh3Im3UEV5PPYGtrb82CRxsuFohthCWQW81O483u1bu+25+XA4nKUw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@napi-rs/keyring-linux-riscv64-gnu@1.2.0': - resolution: {integrity: sha512-awsB5XI1MYL7fwfjMDGmKOWvNgJEO7mM7iVEMS0fO39f0kVJnOSjlu7RHcXAF0LOx+0VfF3oxbWqJmZbvRCRHw==} - engines: {node: '>= 10'} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@napi-rs/keyring-linux-x64-gnu@1.2.0': - resolution: {integrity: sha512-8E+7z4tbxSJXxIBqA+vfB1CGajpCDRyTyqXkBig5NtASrv4YXcntSo96Iah2QDR5zD3dSTsmbqJudcj9rKKuHQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@napi-rs/keyring-linux-x64-musl@1.2.0': - resolution: {integrity: sha512-8RZ8yVEnmWr/3BxKgBSzmgntI7lNEsY7xouNfOsQkuVAiCNmxzJwETspzK3PQ2FHtDxgz5vHQDEBVGMyM4hUHA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@napi-rs/keyring-win32-arm64-msvc@1.2.0': - resolution: {integrity: sha512-AoqaDZpQ6KPE19VBLpxyORcp+yWmHI9Xs9Oo0PJ4mfHma4nFSLVdhAubJCxdlNptHe5va7ghGCHj3L9Akiv4cQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@napi-rs/keyring-win32-ia32-msvc@1.2.0': - resolution: {integrity: sha512-EYL+EEI6bCsYi3LfwcQdnX3P/R76ENKNn+3PmpGheBsUFLuh0gQuP7aMVHM4rTw6UVe+L3vCLZSptq/oeacz0A==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@napi-rs/keyring-win32-x64-msvc@1.2.0': - resolution: {integrity: sha512-xFlx/TsmqmCwNU9v+AVnEJgoEAlBYgzFF5Ihz1rMpPAt4qQWWkMd4sCyM1gMJ1A/GnRqRegDiQpwaxGUHFtFbA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@napi-rs/keyring@1.2.0': - resolution: {integrity: sha512-d0d4Oyxm+v980PEq1ZH2PmS6cvpMIRc17eYpiU47KgW+lzxklMu6+HOEOPmxrpnF/XQZ0+Q78I2mgMhbIIo/dg==} - engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} @@ -4803,541 +4584,58 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/auto-instrumentations-node@0.62.2': - resolution: {integrity: sha512-Ipe6X7ddrCiRsuewyTU83IvKiSFT4piqmv9z8Ovg1E7v98pdTj1pUE6sDrHV50zl7/ypd+cONBgt+EYSZu4u9Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.4.1 - '@opentelemetry/core': ^2.0.0 - - '@opentelemetry/baggage-span-processor@0.4.2': - resolution: {integrity: sha512-chJ9dJ3QSGZeqM71C95vqCtGpHru1+2OF802zW5D0FrpfzOgp2uJ0OdhA/ab2y0IOFbsH7xYu1tKGr7xV40vNw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - '@opentelemetry/context-async-hooks@1.30.1': resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/context-async-hooks@2.0.1': - resolution: {integrity: sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/context-async-hooks@2.5.1': - resolution: {integrity: sha512-MHbu8XxCHcBn6RwvCt2Vpn1WnLMNECfNKYB14LI5XypcgH4IE0/DiVifVR9tAkwPMyLXN8dOoPJfya3IryLQVw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@1.30.1': resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@2.0.1': - resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/core@2.5.1': - resolution: {integrity: sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/exporter-jaeger@2.5.1': - resolution: {integrity: sha512-U97uyVcWGaXlbsB2v7K3ljg8AeE3jaBRqUp5+/pYReZsK2V4sPfZu4iXeO1vLK1ZIXEdghg5RgWXAB7Uj6ubog==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/exporter-logs-otlp-grpc@0.203.0': - resolution: {integrity: sha512-g/2Y2noc/l96zmM+g0LdeuyYKINyBwN6FJySoU15LHPLcMN/1a0wNk2SegwKcxrRdE7Xsm7fkIR5n6XFe3QpPw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-logs-otlp-http@0.203.0': - resolution: {integrity: sha512-s0hys1ljqlMTbXx2XiplmMJg9wG570Z5lH7wMvrZX6lcODI56sG4HL03jklF63tBeyNwK2RV1/ntXGo3HgG4Qw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-logs-otlp-proto@0.203.0': - resolution: {integrity: sha512-nl/7S91MXn5R1aIzoWtMKGvqxgJgepB/sH9qW0rZvZtabnsjbf8OQ1uSx3yogtvLr0GzwD596nQKz2fV7q2RBw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-metrics-otlp-grpc@0.203.0': - resolution: {integrity: sha512-FCCj9nVZpumPQSEI57jRAA89hQQgONuoC35Lt+rayWY/mzCAc6BQT7RFyFaZKJ2B7IQ8kYjOCPsF/HGFWjdQkQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-metrics-otlp-http@0.203.0': - resolution: {integrity: sha512-HFSW10y8lY6BTZecGNpV3GpoSy7eaO0Z6GATwZasnT4bEsILp8UJXNG5OmEsz4SdwCSYvyCbTJdNbZP3/8LGCQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-metrics-otlp-proto@0.203.0': - resolution: {integrity: sha512-OZnhyd9npU7QbyuHXFEPVm3LnjZYifuKpT3kTnF84mXeEQ84pJJZgyLBpU4FSkSwUkt/zbMyNAI7y5+jYTWGIg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-prometheus@0.203.0': - resolution: {integrity: sha512-2jLuNuw5m4sUj/SncDf/mFPabUxMZmmYetx5RKIMIQyPnl6G6ooFzfeE8aXNRf8YD1ZXNlCnRPcISxjveGJHNg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-trace-otlp-grpc@0.203.0': - resolution: {integrity: sha512-322coOTf81bm6cAA8+ML6A+m4r2xTCdmAZzGNTboPXRzhwPt4JEmovsFAs+grpdarObd68msOJ9FfH3jxM6wqA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-trace-otlp-http@0.203.0': - resolution: {integrity: sha512-ZDiaswNYo0yq/cy1bBLJFe691izEJ6IgNmkjm4C6kE9ub/OMQqDXORx2D2j8fzTBTxONyzusbaZlqtfmyqURPw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-trace-otlp-proto@0.203.0': - resolution: {integrity: sha512-1xwNTJ86L0aJmWRwENCJlH4LULMG2sOXWIVw+Szta4fkqKVY50Eo4HoVKKq6U9QEytrWCr8+zjw0q/ZOeXpcAQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-zipkin@2.0.1': - resolution: {integrity: sha512-a9eeyHIipfdxzCfc2XPrE+/TI3wmrZUDFtG2RRXHSbZZULAny7SyybSvaDvS77a7iib5MPiAvluwVvbGTsHxsw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/instrumentation-amqplib@0.50.0': - resolution: {integrity: sha512-kwNs/itehHG/qaQBcVrLNcvXVPW0I4FCOVtw3LHMLdYIqD7GJ6Yv2nX+a4YHjzbzIeRYj8iyMp0Bl7tlkidq5w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-aws-lambda@0.54.1': - resolution: {integrity: sha512-qm8pGSAM1mXk7unbrGktWWGJc6IFI58ZsaHJ+i420Fp5VO3Vf7GglIgaXTS8CKBrVB4LHFj3NvzJg31PtsAQcA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-aws-sdk@0.58.0': - resolution: {integrity: sha512-9vFH7gU686dsAeLMCkqUj9y0MQZ1xrTtStSpNV2UaGWtDnRjJrAdJLu9Y545oKEaDTeVaob4UflyZvvpZnw3Xw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-bunyan@0.49.0': - resolution: {integrity: sha512-ky5Am1y6s3Ex/3RygHxB/ZXNG07zPfg9Z6Ora+vfeKcr/+I6CJbWXWhSBJor3gFgKN3RvC11UWVURnmDpBS6Pg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-cassandra-driver@0.49.0': - resolution: {integrity: sha512-BNIvqldmLkeikfI5w5Rlm9vG5NnQexfPoxOgEMzfDVOEF+vS6351I6DzWLLgWWR9CNF/jQJJi/lr6am2DLp0Rw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-connect@0.47.0': - resolution: {integrity: sha512-pjenvjR6+PMRb6/4X85L4OtkQCootgb/Jzh/l/Utu3SJHBid1F+gk9sTGU2FWuhhEfV6P7MZ7BmCdHXQjgJ42g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-cucumber@0.19.0': - resolution: {integrity: sha512-99ms8kQWRuPt5lkDqbJJzD+7Tq5TMUlBZki4SA2h6CgK4ncX+tyep9XFY1e+XTBLJIWmuFMGbWqBLJ4fSKIQNQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/instrumentation-dataloader@0.21.1': - resolution: {integrity: sha512-hNAm/bwGawLM8VDjKR0ZUDJ/D/qKR3s6lA5NV+btNaPVm2acqhPcT47l2uCVi+70lng2mywfQncor9v8/ykuyw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-dns@0.47.0': - resolution: {integrity: sha512-775fOnewWkTF4iXMGKgwvOGqEmPrU1PZpXjjqvTrEErYBJe7Fz1WlEeUStHepyKOdld7Ghv7TOF/kE3QDctvrg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-express@0.52.0': - resolution: {integrity: sha512-W7pizN0Wh1/cbNhhTf7C62NpyYw7VfCFTYg0DYieSTrtPBT1vmoSZei19wfKLnrMsz3sHayCg0HxCVL2c+cz5w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-fastify@0.48.0': - resolution: {integrity: sha512-3zQlE/DoVfVH6/ycuTv7vtR/xib6WOa0aLFfslYcvE62z0htRu/ot8PV/zmMZfnzpTQj8S/4ULv36R6UIbpJIg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-fs@0.23.0': - resolution: {integrity: sha512-Puan+QopWHA/KNYvDfOZN6M/JtF6buXEyD934vrb8WhsX1/FuM7OtoMlQyIqAadnE8FqqDL4KDPiEfCQH6pQcQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-generic-pool@0.47.0': - resolution: {integrity: sha512-UfHqf3zYK+CwDwEtTjaD12uUqGGTswZ7ofLBEdQ4sEJp9GHSSJMQ2hT3pgBxyKADzUdoxQAv/7NqvL42ZI+Qbw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-graphql@0.51.0': - resolution: {integrity: sha512-LchkOu9X5DrXAnPI1+Z06h/EH/zC7D6sA86hhPrk3evLlsJTz0grPrkL/yUJM9Ty0CL/y2HSvmWQCjbJEz/ADg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-grpc@0.203.0': - resolution: {integrity: sha512-Qmjx2iwccHYRLoE4RFS46CvQE9JG9Pfeae4EPaNZjvIuJxb/pZa2R9VWzRlTehqQWpAvto/dGhtkw8Tv+o0LTg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-hapi@0.50.0': - resolution: {integrity: sha512-5xGusXOFQXKacrZmDbpHQzqYD1gIkrMWuwvlrEPkYOsjUqGUjl1HbxCsn5Y9bUXOCgP1Lj6A4PcKt1UiJ2MujA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-http@0.203.0': - resolution: {integrity: sha512-y3uQAcCOAwnO6vEuNVocmpVzG3PER6/YZqbPbbffDdJ9te5NkHEkfSMNzlC3+v7KlE+WinPGc3N7MR30G1HY2g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-ioredis@0.51.0': - resolution: {integrity: sha512-9IUws0XWCb80NovS+17eONXsw1ZJbHwYYMXiwsfR9TSurkLV5UNbRSKb9URHO+K+pIJILy9wCxvyiOneMr91Ig==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-kafkajs@0.13.0': - resolution: {integrity: sha512-FPQyJsREOaGH64hcxlzTsIEQC4DYANgTwHjiB7z9lldmvua1LRMVn3/FfBlzXoqF179B0VGYviz6rn75E9wsDw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-knex@0.48.0': - resolution: {integrity: sha512-V5wuaBPv/lwGxuHjC6Na2JFRjtPgstw19jTFl1B1b6zvaX8zVDYUDaR5hL7glnQtUSCMktPttQsgK4dhXpddcA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-koa@0.51.0': - resolution: {integrity: sha512-XNLWeMTMG1/EkQBbgPYzCeBD0cwOrfnn8ao4hWgLv0fNCFQu1kCsJYygz2cvKuCs340RlnG4i321hX7R8gj3Rg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-lru-memoizer@0.48.0': - resolution: {integrity: sha512-KUW29wfMlTPX1wFz+NNrmE7IzN7NWZDrmFWHM/VJcmFEuQGnnBuTIdsP55CnBDxKgQ/qqYFp4udQFNtjeFosPw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-memcached@0.47.0': - resolution: {integrity: sha512-vXDs/l4hlWy1IepPG1S6aYiIZn+tZDI24kAzwKKJmR2QEJRL84PojmALAEJGazIOLl/VdcCPZdMb0U2K0VzojA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongodb@0.56.0': - resolution: {integrity: sha512-YG5IXUUmxX3Md2buVMvxm9NWlKADrnavI36hbJsihqqvBGsWnIfguf0rUP5Srr0pfPqhQjUP+agLMsvu0GmUpA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongoose@0.50.0': - resolution: {integrity: sha512-Am8pk1Ct951r4qCiqkBcGmPIgGhoDiFcRtqPSLbJrUZqEPUsigjtMjoWDRLG1Ki1NHgOF7D0H7d+suWz1AAizw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql2@0.50.0': - resolution: {integrity: sha512-PoOMpmq73rOIE3nlTNLf3B1SyNYGsp7QXHYKmeTZZnJ2Ou7/fdURuOhWOI0e6QZ5gSem18IR1sJi6GOULBQJ9g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql@0.49.0': - resolution: {integrity: sha512-QU9IUNqNsrlfE3dJkZnFHqLjlndiU39ll/YAAEvWE40sGOCi9AtOF6rmEGzJ1IswoZ3oyePV7q2MP8SrhJfVAA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-nestjs-core@0.49.0': - resolution: {integrity: sha512-1R/JFwdmZIk3T/cPOCkVvFQeKYzbbUvDxVH3ShXamUwBlGkdEu5QJitlRMyVNZaHkKZKWgYrBarGQsqcboYgaw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-net@0.47.0': - resolution: {integrity: sha512-csoJ++Njpf7C09JH+0HNGenuNbDZBqO1rFhMRo6s0rAmJwNh9zY3M/urzptmKlqbKnf4eH0s+CKHy/+M8fbFsQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-oracledb@0.29.0': - resolution: {integrity: sha512-2aHLiJdkyiUbooIUm7FaZf+O4jyqEl+RfFpgud1dxT87QeeYM216wi+xaMNzsb5yKtRBqbA3qeHBCyenYrOZwA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-pg@0.56.1': - resolution: {integrity: sha512-0/PiHDPVaLdcXNw6Gqb3JBdMxComMEwh444X8glwiynJKJHRTR49+l2cqJfoOVzB8Sl1XRl3Yaqw6aDi3s8e9w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-pino@0.50.1': - resolution: {integrity: sha512-pBbvuWiHA9iAumAuQ0SKYOXK7NRlbnVTf/qBV0nMdRnxBPrc/GZTbh0f7Y59gZfYsbCLhXLL1oRTEnS+PwS3CA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-redis@0.52.0': - resolution: {integrity: sha512-R8Y7cCZlJ2Vl31S2i7bl5SqyC/aul54ski4wCFip/Tp9WGtLK1xVATi2rwy2wkc8ZCtjdEe9eEVR+QFG6gGZxg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-restify@0.49.0': - resolution: {integrity: sha512-tsGZZhS4mVZH7omYxw5jpsrD3LhWizqWc0PYtAnzpFUvL5ZINHE+cm57bssTQ2AK/GtZMxu9LktwCvIIf3dSmw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-router@0.48.0': - resolution: {integrity: sha512-Wixrc8CchuJojXpaS/dCQjFOMc+3OEil1H21G+WLYQb8PcKt5kzW9zDBT19nyjjQOx/D/uHPfgbrT+Dc7cfJ9w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-runtime-node@0.17.1': - resolution: {integrity: sha512-c1FlAk+bB2uF9a8YneGmNPTl7c/xVaan4mmWvbkWcOmH/ipKqR1LaKUlz/BMzLrJLjho1EJlG2NrS2w2Arg+nw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-socket.io@0.50.0': - resolution: {integrity: sha512-6JN6lnKN9ZuZtZdMQIR+no1qHzQvXSZUsNe3sSWMgqmNRyEXuDUWBIyKKeG0oHRHtR4xE4QhJyD4D5kKRPWZFA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-tedious@0.22.0': - resolution: {integrity: sha512-XrrNSUCyEjH1ax9t+Uo6lv0S2FCCykcF7hSxBMxKf7Xn0bPRxD3KyFUZy25aQXzbbbUHhtdxj3r2h88SfEM3aA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-undici@0.14.0': - resolution: {integrity: sha512-2HN+7ztxAReXuxzrtA3WboAKlfP5OsPA57KQn2AdYZbJ3zeRPcLXyW4uO/jpLE6PLm0QRtmeGCmfYpqRlwgSwg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.7.0 - - '@opentelemetry/instrumentation-winston@0.48.1': - resolution: {integrity: sha512-XyOuVwdziirHHYlsw+BWrvdI/ymjwnexupKA787zQQ+D5upaE/tseZxjfQa7+t4+FdVLxHICaMTmkSD4yZHpzQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.203.0': resolution: {integrity: sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.203.0': - resolution: {integrity: sha512-Wbxf7k+87KyvxFr5D7uOiSq/vHXWommvdnNE7vECO3tAhsA2GfOlpWINCMWUEPdHZ7tCXxw6Epp3vgx3jU7llQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-grpc-exporter-base@0.203.0': - resolution: {integrity: sha512-te0Ze1ueJF+N/UOFl5jElJW4U0pZXQ8QklgSfJ2linHN0JJsuaHG8IabEUi2iqxY8ZBDlSiz1Trfv5JcjWWWwQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-transformer@0.203.0': - resolution: {integrity: sha512-Y8I6GgoCna0qDQ2W6GCRtaF24SnvqvA8OfeTi7fqigD23u8Jpb4R5KFv/pRvrlGagcCLICMIyh9wiejp4TXu/A==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/propagator-b3@1.30.1': resolution: {integrity: sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/propagator-b3@2.0.1': - resolution: {integrity: sha512-Hc09CaQ8Tf5AGLmf449H726uRoBNGPBL4bjr7AnnUpzWMvhdn61F78z9qb6IqB737TffBsokGAK1XykFEZ1igw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/propagator-jaeger@1.30.1': resolution: {integrity: sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/propagator-jaeger@2.0.1': - resolution: {integrity: sha512-7PMdPBmGVH2eQNb/AtSJizQNgeNTfh6jQFqys6lfhd6P4r+m/nTh3gKPPpaCXVdRQ+z93vfKk+4UGty390283w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/redis-common@0.38.2': - resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} - engines: {node: ^18.19.0 || >=20.6.0} - - '@opentelemetry/resource-detector-alibaba-cloud@0.31.11': - resolution: {integrity: sha512-R/asn6dAOWMfkLeEwqHCUz0cNbb9oiHVyd11iwlypeT/p9bR1lCX5juu5g/trOwxo62dbuFcDbBdKCJd3O2Edg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/resource-detector-aws@2.12.0': - resolution: {integrity: sha512-VelueKblsnQEiBVqEYcvM9VEb+B8zN6nftltdO9HAD7qi/OlicP4z/UGJ9EeW2m++WabdMoj0G3QVL8YV0P9tw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/resource-detector-azure@0.10.0': - resolution: {integrity: sha512-5cNAiyPBg53Uxe/CW7hsCq8HiKNAUGH+gi65TtgpzSR9bhJG4AEbuZhbJDFwe97tn2ifAD1JTkbc/OFuaaFWbA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/resource-detector-container@0.7.11': - resolution: {integrity: sha512-XUxnGuANa/EdxagipWMXKYFC7KURwed9/V0+NtYjFmwWHzV9/J4IYVGTK8cWDpyUvAQf/vE4sMa3rnS025ivXQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/resource-detector-gcp@0.37.0': - resolution: {integrity: sha512-LGpJBECIMsVKhiulb4nxUw++m1oF4EiDDPmFGW2aqYaAF0oUvJNv8Z/55CAzcZ7SxvlTgUwzewXDBsuCup7iqw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - '@opentelemetry/resources@1.30.1': resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/resources@2.0.1': - resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/resources@2.5.1': - resolution: {integrity: sha512-BViBCdE/GuXRlp9k7nS1w6wJvY5fnFX5XvuEtWsTAOQFIO89Eru7lGW3WbfbxtCuZ/GbrJfAziXG0w0dpxL7eQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-logs@0.203.0': - resolution: {integrity: sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.10.0' - - '@opentelemetry/sdk-metrics@2.0.1': - resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.9.0 <1.10.0' - - '@opentelemetry/sdk-metrics@2.5.1': - resolution: {integrity: sha512-RKMn3QKi8nE71ULUo0g/MBvq1N4icEBo7cQSKnL3URZT16/YH3nSVgWegOjwx7FRBTrjOIkMJkCUn/ZFIEfn4A==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.9.0 <1.10.0' - - '@opentelemetry/sdk-node@0.203.0': - resolution: {integrity: sha512-zRMvrZGhGVMvAbbjiNQW3eKzW/073dlrSiAKPVWmkoQzah9wfynpVPeL55f9fVIm0GaBxTLcPeukWGy0/Wj7KQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-base@1.30.1': resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-base@2.0.1': - resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-trace-base@2.5.1': - resolution: {integrity: sha512-iZH3Gw8cxQn0gjpOjJMmKLd9GIaNh/E3v3ST67vyzLSxHBs14HsG4dy7jMYyC5WXGdBVEcM7U/XTF5hCQxjDMw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-node@1.30.1': resolution: {integrity: sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-node@2.0.1': - resolution: {integrity: sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/sdk-trace-node@2.5.1': - resolution: {integrity: sha512-9lopQ6ZoElETOEN0csgmtEV5/9C7BMfA7VtF4Jape3i954b6sTY2k3Xw3CxUTKreDck/vpAuJM+EDo4zheUw+A==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.28.0': resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.40.0': - resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} - engines: {node: '>=14'} - - '@opentelemetry/sql-common@0.41.2': - resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@orama/cuid2@2.2.3': resolution: {integrity: sha512-Lcak3chblMejdlSHgYU2lS2cdOhDpU6vkfIJH4m+YKvqQyLqs1bB8+w6NT1MG5bO12NUK2GFc34Mn2xshMIQ1g==} @@ -5599,9 +4897,6 @@ packages: '@petamoriken/float16@3.9.3': resolution: {integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==} - '@pinojs/redact@0.4.0': - resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -5703,42 +4998,6 @@ packages: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@protobuf-ts/runtime-rpc@2.11.1': - resolution: {integrity: sha512-4CqqUmNA+/uMz00+d3CYKgElXO9VrEbucjnBFEjqI4GuDrEQ32MaI3q+9qPBvIGOlL4PmHXrzM32vBPWRhQKWQ==} - - '@protobuf-ts/runtime@2.11.1': - resolution: {integrity: sha512-KuDaT1IfHkugM2pyz+FwiY80ejWrkH1pAtOBOZFuR6SXEFTsnb/jiQWQ1rCIrcKx2BtyxnxW6BWwsVSA/Ie+WQ==} - - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@publint/pack@0.1.4': resolution: {integrity: sha512-HDVTWq3H0uTXiU0eeSQntcVUTPP3GamzeXI41+x7uU9J65JgWQh3qWZHblR1i0npXfFtF+mxBiU2nJH8znxWnQ==} engines: {node: '>=18'} @@ -7769,9 +7028,6 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - '@types/aws-lambda@8.10.152': - resolution: {integrity: sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -7796,9 +7052,6 @@ packages: '@types/bun@1.3.9': resolution: {integrity: sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw==} - '@types/bunyan@1.8.11': - resolution: {integrity: sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==} - '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} @@ -7967,9 +7220,6 @@ packages: '@types/jsesc@2.5.1': resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/jsrsasign@10.5.15': resolution: {integrity: sha512-3stUTaSRtN09PPzVWR6aySD9gNnuymz+WviNHoTb85dKu+BjaV4uBbWWGykBBJkfwPtcNZVfTn2lbX00U+yhpQ==} @@ -7982,18 +7232,12 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - '@types/memcached@2.2.10': - resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==} - '@types/micromatch@4.0.10': resolution: {integrity: sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ==} '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/mysql@2.15.27': - resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} - '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} @@ -8012,15 +7256,6 @@ packages: '@types/offscreencanvas@2019.7.3': resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} - '@types/oracledb@6.5.2': - resolution: {integrity: sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ==} - - '@types/pg-pool@2.0.6': - resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} - - '@types/pg@8.15.5': - resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} - '@types/pg@8.16.0': resolution: {integrity: sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==} @@ -8082,9 +7317,6 @@ packages: '@types/supports-color@8.1.3': resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - '@types/tedious@4.0.14': - resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} - '@types/text-table@0.2.5': resolution: {integrity: sha512-hcZhlNvMkQG/k1vcZ6yHOl6WAYftQ2MLfTHcYRZ2xYZFD8tGVnE3qFV0lj1smQeDSR7/yY0PyuUalauf33bJeA==} @@ -8191,15 +7423,6 @@ packages: vue-router: optional: true - '@vercel/functions@1.6.0': - resolution: {integrity: sha512-R6FKQrYT5MZs5IE1SqeCJWxMuBdHawFcCZboKKw8p7s+6/mcd55Gx6tWmyKnQTyrSEA04NH73Tc9CbqpEle8RA==} - engines: {node: '>= 16'} - peerDependencies: - '@aws-sdk/credential-provider-web-identity': '*' - peerDependenciesMeta: - '@aws-sdk/credential-provider-web-identity': - optional: true - '@vercel/nft@1.3.2': resolution: {integrity: sha512-HC8venRc4Ya7vNeBsJneKHHMDDWpQie7VaKhAIOst3MKO+DES+Y/SbzSp8mFkD7OzwAE2HhHkeSuSmwS20mz3A==} engines: {node: '>=20'} @@ -8407,12 +7630,6 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - ai@6.0.14: - resolution: {integrity: sha512-OaEJFeQ3gb45eZtC/lSNKqAxmsrqWxC8wLmIVXFYAMvPXE3lb96zIdS3swYArR4uXOVt6N7H/XZSyQz/Dl+HTw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -8434,9 +7651,6 @@ packages: ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-color@0.2.2: - resolution: {integrity: sha512-qPx7iZZDHITYrrfzaUFXQpIcF2xYifcQHQflP1pFz8yY3lfU6GgCHb0+hJD7nimYKO7f2iaYYwBpZ+GaNcAhcA==} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -8525,20 +7739,12 @@ packages: resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - array-iterate@2.0.1: resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -8569,10 +7775,6 @@ packages: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} @@ -8585,17 +7787,9 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - atomically@2.1.1: resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - aws-ssl-profiles@1.1.2: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} engines: {node: '>= 6.0.0'} @@ -8738,76 +7932,6 @@ packages: peerDependencies: better-auth: ^1.0.3 - better-auth@1.4.19: - resolution: {integrity: sha512-3RlZJcA0+NH25wYD85vpIGwW9oSTuEmLIaGbT8zg41w/Pa2hVWHKedjoUHHJtnzkBXzDb+CShkLnSw7IThDdqQ==} - peerDependencies: - '@lynx-js/react': '*' - '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 - '@sveltejs/kit': ^2.0.0 - '@tanstack/react-start': ^1.0.0 - '@tanstack/solid-start': ^1.0.0 - better-sqlite3: ^12.0.0 - drizzle-kit: '>=0.31.4' - drizzle-orm: '>=0.41.0' - mongodb: ^6.0.0 || ^7.0.0 - mysql2: ^3.0.0 - next: ^14.0.0 || ^15.0.0 || ^16.0.0 - pg: ^8.0.0 - prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - solid-js: ^1.0.0 - svelte: ^4.0.0 || ^5.0.0 - vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 - vue: ^3.0.0 - peerDependenciesMeta: - '@lynx-js/react': - optional: true - '@prisma/client': - optional: true - '@sveltejs/kit': - optional: true - '@tanstack/react-start': - optional: true - '@tanstack/solid-start': - optional: true - better-sqlite3: - optional: true - drizzle-kit: - optional: true - drizzle-orm: - optional: true - mongodb: - optional: true - mysql2: - optional: true - next: - optional: true - pg: - optional: true - prisma: - optional: true - react: - optional: true - react-dom: - optional: true - solid-js: - optional: true - svelte: - optional: true - vitest: - optional: true - vue: - optional: true - - better-call@1.1.8: - resolution: {integrity: sha512-XMQ2rs6FNXasGNfMjzbyroSwKwYbZ/T3IxruSS6U2MJRsSYh3wYtG3o6H00ZlKZ/C/UPOAD97tqgQJNsxyeTXw==} - peerDependencies: - zod: ^4.0.0 - peerDependenciesMeta: - zod: - optional: true - better-call@1.3.2: resolution: {integrity: sha512-4cZIfrerDsNTn3cm+MhLbUePN0gdwkhSXEuG7r/zuQ8c/H7iU0/jSK5TD3FW7U0MgKHce/8jGpPYNO4Ve+4NBw==} peerDependencies: @@ -8831,9 +7955,6 @@ packages: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -8933,10 +8054,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bufrw@1.4.0: - resolution: {integrity: sha512-sWm8iPbqvL9+5SiYxXH73UOkyEbGQg7kyHQmReF89WJHQJw2eV4P/yZ0E+b71cczJ4pPobVhXxgQcmfSTgGHxQ==} - engines: {node: '>= 0.10.x'} - bumpp@10.4.1: resolution: {integrity: sha512-X/bwWs5Gbb/D7rN4aHLB7zdjiA6nGdjckM1sTHhI9oovIbEw2L5pw5S4xzk8ZTeOZ8EnwU/Ze4SoZ6/Vr3pM2Q==} engines: {node: '>=18'} @@ -8989,10 +8106,6 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} @@ -9243,9 +8356,6 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -9672,27 +8782,12 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - date-fns-jalali@4.1.0-0: resolution: {integrity: sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==} date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} - dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dax-sh@0.43.2: resolution: {integrity: sha512-uULa1sSIHgXKGCqJ/pA0zsnzbHlVnuq7g8O2fkHokWFNwEGIhh5lAJlxZa1POG5En5ba7AU4KcBAvGQWMMf8rg==} deprecated: This package has moved to simply be 'dax' instead of 'dax-sh' @@ -9907,10 +9002,6 @@ packages: resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} engines: {node: '>=12'} - dotenv-expand@12.0.3: - resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} - engines: {node: '>=12'} - dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} @@ -10023,98 +9114,6 @@ packages: sqlite3: optional: true - drizzle-orm@0.44.7: - resolution: {integrity: sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ==} - peerDependencies: - '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': '>=4' - '@electric-sql/pglite': '>=0.2.0' - '@libsql/client': '>=0.10.0' - '@libsql/client-wasm': '>=0.10.0' - '@neondatabase/serverless': '>=0.10.0' - '@op-engineering/op-sqlite': '>=2' - '@opentelemetry/api': ^1.4.1 - '@planetscale/database': '>=1.13' - '@prisma/client': '*' - '@tidbcloud/serverless': '*' - '@types/better-sqlite3': '*' - '@types/pg': '*' - '@types/sql.js': '*' - '@upstash/redis': '>=1.34.7' - '@vercel/postgres': '>=0.8.0' - '@xata.io/client': '*' - better-sqlite3: '>=7' - bun-types: '*' - expo-sqlite: '>=14.0.0' - gel: '>=2' - knex: '*' - kysely: '*' - mysql2: '>=2' - pg: '>=8' - postgres: '>=3' - prisma: '*' - sql.js: '>=1' - sqlite3: '>=5' - peerDependenciesMeta: - '@aws-sdk/client-rds-data': - optional: true - '@cloudflare/workers-types': - optional: true - '@electric-sql/pglite': - optional: true - '@libsql/client': - optional: true - '@libsql/client-wasm': - optional: true - '@neondatabase/serverless': - optional: true - '@op-engineering/op-sqlite': - optional: true - '@opentelemetry/api': - optional: true - '@planetscale/database': - optional: true - '@prisma/client': - optional: true - '@tidbcloud/serverless': - optional: true - '@types/better-sqlite3': - optional: true - '@types/pg': - optional: true - '@types/sql.js': - optional: true - '@upstash/redis': - optional: true - '@vercel/postgres': - optional: true - '@xata.io/client': - optional: true - better-sqlite3: - optional: true - bun-types: - optional: true - expo-sqlite: - optional: true - gel: - optional: true - knex: - optional: true - kysely: - optional: true - mysql2: - optional: true - pg: - optional: true - postgres: - optional: true - prisma: - optional: true - sql.js: - optional: true - sqlite3: - optional: true - drizzle-orm@0.45.1: resolution: {integrity: sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==} peerDependencies: @@ -10207,12 +9206,6 @@ packages: sqlite3: optional: true - drizzle-zod@0.8.3: - resolution: {integrity: sha512-66yVOuvGhKJnTdiqj1/Xaaz9/qzOdRJADpDa68enqS6g3t0kpNkwNYjUuaeXgZfO/UWuIM9HIhSlJ6C5ZraMww==} - peerDependencies: - drizzle-orm: '>=0.36.0' - zod: ^3.25.0 || ^4.0.0 - dts-resolver@2.1.3: resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} engines: {node: '>=20.19.0'} @@ -10364,17 +9357,10 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - error@7.0.2: - resolution: {integrity: sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==} - errorhandler@1.5.2: resolution: {integrity: sha512-kNAL7hESndBCrWwS72QyV3IVOTrVmj9D062FV5BQswNL5zEdeRmz/WJFyh6Aj/plvvSOrzddkxW57HgkZcR9Fw==} engines: {node: '>= 0.8'} - es-abstract@1.24.1: - resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} - engines: {node: '>= 0.4'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -10394,10 +9380,6 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - es-toolkit@1.44.0: resolution: {integrity: sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==} @@ -10545,10 +9527,6 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - exit-hook@4.0.0: - resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} - engines: {node: '>=18'} - expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -10710,9 +9688,6 @@ packages: resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} engines: {node: '>=8.0.0'} - fast-copy@4.0.2: - resolution: {integrity: sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -10730,9 +9705,6 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-sha256@1.3.0: resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} @@ -10824,10 +9796,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} - fkill@9.0.0: resolution: {integrity: sha512-MdYSsbdCaIRjzo5edthZtWmEZVMfr1qrtYZUHIdO3swCE+CoZA8S5l0s4jDsYlTa9ZiXv0pTgpzE7s4N8NeUOA==} engines: {node: '>=18'} @@ -10850,10 +9818,6 @@ packages: fontfaceobserver@2.3.0: resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==} - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - foreground-child@2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} @@ -10875,9 +9839,6 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} - forwarded-parse@2.1.2: - resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -11185,21 +10146,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gaxios@6.7.1: - resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} - engines: {node: '>=14'} - - gcp-metadata@6.1.1: - resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} - engines: {node: '>=14'} - geist@1.7.0: resolution: {integrity: sha512-ZaoiZwkSf0DwwB1ncdLKp+ggAldqxl5L1+SXaNIBGkPAqcu+xjVJLxlf3/S8vLt9UHx1xu5fz3lbzKCj5iOVdQ==} peerDependencies: @@ -11213,10 +10159,6 @@ packages: generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - gensequence@8.0.8: resolution: {integrity: sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==} engines: {node: '>=20'} @@ -11264,10 +10206,6 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - get-tsconfig@4.13.6: resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} @@ -11327,13 +10265,6 @@ packages: glsl-noise@0.0.0: resolution: {integrity: sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==} - google-logging-utils@0.0.2: - resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} - engines: {node: '>=14'} - - google-protobuf@4.0.2: - resolution: {integrity: sha512-yD2fqbNgvJPuQwdKJiPdbUcXveNRxgqy070gzsBsCyFJA8Qdj9oxa9xtkddb/JEhcDk0RD5SfGUWg+nhINfMxA==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -11386,10 +10317,6 @@ packages: resolution: {integrity: sha512-hR/uLYQdngTyEfxnOoa+e6KTcfBFyc1hgFj/Cc144A5JJUuHFYqIEBDcD4FeGqUeKLRZqJ9eN9u7/GDjYEgS1g==} engines: {node: '>=20.0.0'} - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -11401,10 +10328,6 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -11460,9 +10383,6 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} - help-me@5.0.0: - resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - hermes-compiler@250829098.0.9: resolution: {integrity: sha512-hZ5O7PDz1vQ99TS7HD3FJ9zVynfU1y+VWId6U1Pldvd8hmAYrNec/XLPYJKD3dLOW6NXak6aAQAuMuSo3ji0tQ==} @@ -11488,11 +10408,6 @@ packages: resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} engines: {node: '>=6'} - hexer@1.5.0: - resolution: {integrity: sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg==} - engines: {node: '>= 0.10.x'} - hasBin: true - highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} @@ -11507,8 +10422,8 @@ packages: resolution: {integrity: sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==} engines: {node: '>=16.9.0'} - hono@4.12.5: - resolution: {integrity: sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==} + hono@4.12.7: + resolution: {integrity: sha512-jq9l1DM0zVIvsm3lv9Nw9nlJnMNPOcAtsbsgiUhWcFzPE99Gvo6yRTlszSLLYacMeQ6quHD6hMfId8crVHvexw==} engines: {node: '>=16.9.0'} hookable@5.5.3: @@ -11702,10 +10617,6 @@ packages: react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -11741,48 +10652,20 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-arrayish@0.3.4: resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -11807,10 +10690,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} @@ -11819,10 +10698,6 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -11839,24 +10714,12 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -11884,22 +10747,10 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - is-safe-filename@0.1.1: resolution: {integrity: sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==} engines: {node: '>=20'} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -11908,18 +10759,6 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -11927,18 +10766,6 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - is-what@3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} @@ -11969,9 +10796,6 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.35: resolution: {integrity: sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg==} engines: {node: '>=18'} @@ -12020,16 +10844,9 @@ packages: peerDependencies: react: ^19.0.0 - iwanthue@2.0.0: - resolution: {integrity: sha512-baARnKbEygsic78ekXFxvEfVyiWPchkeoUYy6StEhjF4ayCanBZQhEiXlzPXIUXtgVCYyvwex0dnw1Ghg8UCCg==} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jaeger-client@3.19.0: - resolution: {integrity: sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw==} - engines: {node: '>=10'} - jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -12077,10 +10894,6 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true - jmespath@0.16.0: - resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} - engines: {node: '>= 0.6.0'} - joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} @@ -12105,10 +10918,6 @@ packages: react: optional: true - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} @@ -12152,9 +10961,6 @@ packages: engines: {node: '>=6'} hasBin: true - json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -12413,16 +11219,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lodash-es@4.17.23: resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -12481,10 +11280,6 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} - long@2.4.0: - resolution: {integrity: sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==} - engines: {node: '>=0.6'} - long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} @@ -13478,13 +12273,6 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - obliterator@2.0.5: - resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} - obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} @@ -13494,10 +12282,6 @@ packages: ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -13550,28 +12334,9 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - openai@5.23.2: - resolution: {integrity: sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.23.8 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - - openapi3-ts@4.5.0: - resolution: {integrity: sha512-jaL+HgTq2Gj5jRcfdutgRGLosCy/hT8sQf6VOy+P+g36cZOjI1iukdPnijC+4CmeRzg/jEllJUboEic2FhxhtQ==} - openid-client@6.8.2: resolution: {integrity: sha512-uOvTCndr4udZsKihJ68H9bUICrriHdUVJ6Az+4Ns6cW55rwM5h0bjVIzDz2SxgOI84LKjFyjOFvERLzdTUROGA==} - opentracing@0.14.7: - resolution: {integrity: sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==} - engines: {node: '>=0.10'} - ora@3.4.0: resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} engines: {node: '>=6'} @@ -13583,10 +12348,6 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - oxc-resolver@11.19.0: resolution: {integrity: sha512-oEe42WEoZc2T5sCQqgaRBx8huzP4cJvrnm+BfNTJESdtM633Tqs6iowkpsMTXgnb7SLwU6N6D9bqwW/PULjo6A==} @@ -13602,10 +12363,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -13614,10 +12371,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-map@3.0.0: resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} engines: {node: '>=8'} @@ -13717,10 +12470,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -13828,23 +12577,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pino-abstract-transport@2.0.0: - resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} - - pino-abstract-transport@3.0.0: - resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} - - pino-pretty@13.1.3: - resolution: {integrity: sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==} - hasBin: true - - pino-std-serializers@7.1.0: - resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} - - pino@9.14.0: - resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} - hasBin: true - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -13891,10 +12623,6 @@ packages: points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - postal-mime@2.7.3: resolution: {integrity: sha512-MjhXadAJaWgYzevi46+3kLak8y6gbg0ku14O1gO/LNOuay8dO+1PtcSGvAdgDR0DoIsSaiIA8y/Ddw6MnrO0Tw==} @@ -14004,13 +12732,6 @@ packages: resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} engines: {node: '>=8'} - process-warning@5.0.0: - resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} - - process@0.10.1: - resolution: {integrity: sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA==} - engines: {node: '>= 0.6.0'} - process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -14056,10 +12777,6 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -14094,9 +12811,6 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - pusher-js@8.4.0: - resolution: {integrity: sha512-wp3HqIIUc1GRyu1XrP6m2dgyE9MoCsXVsWNlohj0rjSkLf+a0jLvEyVubdg58oMk7bhjBWnFClgp8jfAa6Ak4Q==} - pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} @@ -14132,9 +12846,6 @@ packages: queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} - quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -14395,10 +13106,6 @@ packages: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} - real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - recast@0.23.11: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} @@ -14444,10 +13151,6 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - regenerate-unicode-properties@10.2.2: resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} @@ -14476,10 +13179,6 @@ packages: regexp-to-ast@0.5.0: resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - regexpu-core@6.4.0: resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} @@ -14950,28 +13649,12 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -15012,9 +13695,6 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} - secure-json-parse@4.1.0: - resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} - selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} @@ -15094,18 +13774,6 @@ packages: set-cookie-parser@3.0.1: resolution: {integrity: sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -15237,9 +13905,6 @@ packages: peerDependencies: solid-js: ^1.7 - sonic-boom@4.2.1: - resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} - sonner@2.0.7: resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} peerDependencies: @@ -15357,10 +14022,6 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - stream-buffers@2.2.0: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} @@ -15378,9 +14039,6 @@ packages: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} - string-template@0.2.1: - resolution: {integrity: sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -15400,18 +14058,6 @@ packages: string.prototype.codepointat@0.2.1: resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -15663,9 +14309,6 @@ packages: peerDependencies: tslib: ^2 - thread-stream@3.1.0: - resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} - three-mesh-bvh@0.8.3: resolution: {integrity: sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==} peerDependencies: @@ -15679,11 +14322,6 @@ packages: three@0.183.2: resolution: {integrity: sha512-di3BsL2FEQ1PA7Hcvn4fyJOlxRRgFYBpMTcyOgkwJIaDOdJMebEFPA+t98EvjuljDx4hNulAGwF6KIjtwI5jgQ==} - thriftrw@3.11.4: - resolution: {integrity: sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA==} - engines: {node: '>= 0.10.x'} - hasBin: true - throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} @@ -15768,10 +14406,6 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} - traverse@0.6.11: - resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==} - engines: {node: '>= 0.4'} - tree-dump@1.1.0: resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} engines: {node: '>=10.0'} @@ -15811,9 +14445,6 @@ packages: ts-morph@27.0.2: resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} - ts-pattern@5.9.0: - resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} - tsdown@0.21.0-beta.2: resolution: {integrity: sha512-OKj8mKf0ws1ucxuEi3mO/OGyfRQxO9MY2D6SoIE/7RZcbojsZSBhJr4xC4MNivMqrQvi3Ke2e+aRZDemPBWPCw==} engines: {node: '>=20.19.0'} @@ -15900,9 +14531,6 @@ packages: tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} - tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} - type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -15943,29 +14571,9 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typedarray.prototype.slice@1.0.5: - resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} - engines: {node: '>= 0.4'} - typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -16005,10 +14613,6 @@ packages: ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} @@ -16071,10 +14675,6 @@ packages: unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - unicorn-magic@0.4.0: resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} engines: {node: '>=20'} @@ -16306,10 +14906,6 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - valibot@1.2.0: resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} peerDependencies: @@ -16605,25 +15201,9 @@ packages: when-exit@2.1.5: resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} - engines: {node: '>= 0.4'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -16795,9 +15375,6 @@ packages: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} - xorshift@1.2.0: - resolution: {integrity: sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g==} - xpath@0.0.32: resolution: {integrity: sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==} engines: {node: '>=0.6.0'} @@ -16860,10 +15437,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.2: - resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} - engines: {node: '>=12.20'} - yocto-spinner@0.2.3: resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} engines: {node: '>=18.19'} @@ -16957,19 +15530,6 @@ snapshots: '@ai-sdk/provider-utils': 4.0.16(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/anthropic@3.0.7(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.2 - '@ai-sdk/provider-utils': 4.0.4(zod@4.3.6) - zod: 4.3.6 - - '@ai-sdk/azure@3.0.38(zod@4.3.6)': - dependencies: - '@ai-sdk/openai': 3.0.37(zod@4.3.6) - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.16(zod@4.3.6) - zod: 4.3.6 - '@ai-sdk/gateway@3.0.59(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 @@ -16984,43 +15544,18 @@ snapshots: '@vercel/oidc': 3.1.0 zod: 4.3.6 - '@ai-sdk/gateway@3.0.9(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.2 - '@ai-sdk/provider-utils': 4.0.4(zod@4.3.6) - '@vercel/oidc': 3.1.0 - zod: 4.3.6 - - '@ai-sdk/google@3.0.4(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.2 - '@ai-sdk/provider-utils': 4.0.4(zod@4.3.6) - zod: 4.3.6 - '@ai-sdk/openai-compatible@2.0.30(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/openai-compatible@2.0.4(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.2 - '@ai-sdk/provider-utils': 4.0.4(zod@4.3.6) - zod: 4.3.6 - '@ai-sdk/openai@3.0.37(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 '@ai-sdk/provider-utils': 4.0.16(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/openai@3.0.7(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.2 - '@ai-sdk/provider-utils': 4.0.4(zod@4.3.6) - zod: 4.3.6 - '@ai-sdk/provider-utils@4.0.15(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 @@ -17042,17 +15577,6 @@ snapshots: eventsource-parser: 3.0.6 zod: 4.3.6 - '@ai-sdk/provider-utils@4.0.4(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.2 - '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 - zod: 4.3.6 - - '@ai-sdk/provider@3.0.2': - dependencies: - json-schema: 0.4.0 - '@ai-sdk/provider@3.0.8': dependencies: json-schema: 0.4.0 @@ -17195,24 +15719,12 @@ snapshots: typescript: 5.6.1-rc validate-npm-package-name: 5.0.1 - '@asteasolutions/zod-to-openapi@8.4.3(zod@4.3.6)': - dependencies: - openapi3-ts: 4.5.0 - zod: 4.3.6 - '@authenio/xml-encryption@2.0.2': dependencies: '@xmldom/xmldom': 0.8.11 escape-html: 1.0.3 xpath: 0.0.32 - '@authzed/authzed-node@1.6.1': - dependencies: - '@grpc/grpc-js': 1.14.3 - '@protobuf-ts/runtime': 2.11.1 - '@protobuf-ts/runtime-rpc': 2.11.1 - google-protobuf: 4.0.2 - '@azure-rest/core-client@2.5.1': dependencies: '@azure/abort-controller': 2.1.2 @@ -18000,36 +16512,6 @@ snapshots: '@babel/helper-string-parser': 8.0.0-rc.2 '@babel/helper-validator-identifier': 8.0.0-rc.1 - '@better-auth/core@1.4.19(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1)': - dependencies: - '@better-auth/utils': 0.3.0 - '@better-fetch/fetch': 1.1.21 - '@standard-schema/spec': 1.1.0 - better-call: 1.1.8(zod@4.3.6) - jose: 6.1.3 - kysely: 0.28.11 - nanostores: 1.1.1 - zod: 4.3.6 - - '@better-auth/sso@1.4.19(@better-auth/utils@0.3.0)(better-auth@1.4.19(cbf096bc24bc5dd4eee3786e0f4ed2f6))(better-call@1.1.8(zod@4.3.6))': - dependencies: - '@better-auth/utils': 0.3.0 - '@better-fetch/fetch': 1.1.21 - better-auth: 1.4.19(cbf096bc24bc5dd4eee3786e0f4ed2f6) - better-call: 1.1.8(zod@4.3.6) - fast-xml-parser: 5.4.1 - jose: 6.1.3 - samlify: 2.10.2 - zod: 4.3.6 - - '@better-auth/telemetry@1.4.19(@better-auth/core@1.4.19(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))': - dependencies: - '@better-auth/core': 1.4.19(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) - '@better-auth/utils': 0.3.0 - '@better-fetch/fetch': 1.1.21 - - '@better-auth/utils@0.3.0': {} - '@better-auth/utils@0.3.1': {} '@better-fetch/fetch@1.1.21': {} @@ -18179,27 +16661,6 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@composio/client@0.1.0-alpha.40': {} - - '@composio/core@0.2.6(ws@8.19.0)(zod@4.3.6)': - dependencies: - '@composio/client': 0.1.0-alpha.40 - '@composio/json-schema-to-zod': 0.1.19(zod@4.3.6) - '@types/json-schema': 7.0.15 - chalk: 4.1.2 - openai: 5.23.2(ws@8.19.0)(zod@4.3.6) - pusher-js: 8.4.0 - semver: 7.7.4 - uuid: 13.0.0 - zod: 4.3.6 - zod-to-json-schema: 3.25.1(zod@4.3.6) - transitivePeerDependencies: - - ws - - '@composio/json-schema-to-zod@0.1.19(zod@4.3.6)': - dependencies: - zod: 4.3.6 - '@cspell/cspell-bundled-dicts@9.7.0': dependencies: '@cspell/dict-ada': 4.1.1 @@ -19256,18 +17717,6 @@ snapshots: optionalDependencies: tailwindcss: 4.2.1 - '@grpc/grpc-js@1.14.3': - dependencies: - '@grpc/proto-loader': 0.8.0 - '@js-sdsl/ordered-map': 4.4.2 - - '@grpc/proto-loader@0.8.0': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.5.4 - yargs: 17.7.2 - '@hapi/hoek@9.3.0': optional: true @@ -19280,27 +17729,14 @@ snapshots: '@hongzhiyuan/preact@10.28.0-fc4af453': {} - '@hono/node-server@1.19.11(hono@4.12.5)': + '@hono/node-server@1.19.11(hono@4.12.7)': dependencies: - hono: 4.12.5 + hono: 4.12.7 '@hono/node-server@1.19.9(hono@4.11.4)': dependencies: hono: 4.11.4 - '@hono/zod-openapi@1.2.2(hono@4.12.5)(zod@4.3.6)': - dependencies: - '@asteasolutions/zod-to-openapi': 8.4.3(zod@4.3.6) - '@hono/zod-validator': 0.7.6(hono@4.12.5)(zod@4.3.6) - hono: 4.12.5 - openapi3-ts: 4.5.0 - zod: 4.3.6 - - '@hono/zod-validator@0.7.6(hono@4.12.5)(zod@4.3.6)': - dependencies: - hono: 4.12.5 - zod: 4.3.6 - '@hookform/resolvers@5.2.2(react-hook-form@7.71.2(react@19.2.4))': dependencies: '@standard-schema/utils': 0.3.0 @@ -19410,166 +17846,6 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inkeep/agents-core@0.54.0(40753130b1035a99cd9a23afc577a573)': - dependencies: - '@ai-sdk/anthropic': 3.0.7(zod@4.3.6) - '@ai-sdk/azure': 3.0.38(zod@4.3.6) - '@ai-sdk/gateway': 3.0.9(zod@4.3.6) - '@ai-sdk/google': 3.0.4(zod@4.3.6) - '@ai-sdk/openai': 3.0.7(zod@4.3.6) - '@ai-sdk/openai-compatible': 2.0.4(zod@4.3.6) - '@ai-sdk/provider': 3.0.2 - '@authzed/authzed-node': 1.6.1 - '@babel/parser': 7.29.0 - '@better-auth/sso': 1.4.19(@better-auth/utils@0.3.0)(better-auth@1.4.19(cbf096bc24bc5dd4eee3786e0f4ed2f6))(better-call@1.1.8(zod@4.3.6)) - '@composio/core': 0.2.6(ws@8.19.0)(zod@4.3.6) - '@electric-sql/pglite': 0.3.15 - '@hono/zod-openapi': 1.2.2(hono@4.12.5)(zod@4.3.6) - '@modelcontextprotocol/sdk': 1.27.1(zod@4.3.6) - '@nangohq/node': 0.69.38 - '@nangohq/types': 0.69.38 - '@napi-rs/keyring': 1.2.0 - '@openrouter/ai-sdk-provider': 2.2.5(ai@6.0.14(zod@4.3.6))(zod@4.3.6) - '@opentelemetry/api': 1.9.0 - '@vercel/functions': 1.6.0 - ai: 6.0.14(zod@4.3.6) - ajv: 8.18.0 - better-auth: 1.4.19(cbf096bc24bc5dd4eee3786e0f4ed2f6) - destr: 2.0.5 - dotenv: 17.3.1 - dotenv-expand: 12.0.3 - drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.2))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) - drizzle-zod: 0.8.3(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.2))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(zod@4.3.6) - exit-hook: 4.0.0 - find-up: 7.0.0 - hono: 4.12.5 - iwanthue: 2.0.0 - jmespath: 0.16.0 - jose: 6.1.3 - nanoid: 5.1.6 - pg: 8.19.0 - pino: 9.14.0 - pino-pretty: 13.1.3 - postgres: 3.4.8 - traverse: 0.6.11 - ts-pattern: 5.9.0 - zod: 4.3.6 - optionalDependencies: - '@opentelemetry/auto-instrumentations-node': 0.62.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0))(encoding@0.1.13) - '@opentelemetry/baggage-span-processor': 0.4.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-jaeger': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - '@aws-sdk/client-rds-data' - - '@aws-sdk/credential-provider-web-identity' - - '@better-auth/utils' - - '@cfworker/json-schema' - - '@cloudflare/workers-types' - - '@libsql/client' - - '@libsql/client-wasm' - - '@lynx-js/react' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/core' - - '@planetscale/database' - - '@prisma/client' - - '@sveltejs/kit' - - '@tanstack/react-start' - - '@tanstack/solid-start' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@upstash/redis' - - '@vercel/postgres' - - '@xata.io/client' - - better-call - - better-sqlite3 - - bun-types - - debug - - drizzle-kit - - encoding - - expo-sqlite - - gel - - knex - - kysely - - mongodb - - mysql2 - - next - - pg-native - - prisma - - react - - react-dom - - solid-js - - sql.js - - sqlite3 - - supports-color - - svelte - - vitest - - vue - - ws - - '@inkeep/ai-sdk-provider@0.54.0(d83c022487f0e4a5f3e31c50322904ae)': - dependencies: - '@ai-sdk/provider': 3.0.2 - '@ai-sdk/provider-utils': 4.0.4(zod@4.3.6) - '@inkeep/agents-core': 0.54.0(40753130b1035a99cd9a23afc577a573) - zod: 4.3.6 - transitivePeerDependencies: - - '@aws-sdk/client-rds-data' - - '@aws-sdk/credential-provider-web-identity' - - '@better-auth/utils' - - '@cfworker/json-schema' - - '@cloudflare/workers-types' - - '@hono/zod-openapi' - - '@libsql/client' - - '@libsql/client-wasm' - - '@lynx-js/react' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/core' - - '@planetscale/database' - - '@prisma/client' - - '@sveltejs/kit' - - '@tanstack/react-start' - - '@tanstack/solid-start' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@upstash/redis' - - '@vercel/postgres' - - '@xata.io/client' - - better-call - - better-sqlite3 - - bun-types - - debug - - drizzle-kit - - encoding - - expo-sqlite - - gel - - knex - - kysely - - mongodb - - mysql2 - - next - - pg-native - - prisma - - react - - react-dom - - solid-js - - sql.js - - sqlite3 - - supports-color - - svelte - - vitest - - vue - - ws - '@inquirer/ansi@1.0.2': {} '@inquirer/confirm@5.1.21(@types/node@25.3.2)': @@ -19736,8 +18012,6 @@ snapshots: '@js-joda/core@5.7.0': {} - '@js-sdsl/ordered-map@4.4.2': {} - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -19995,7 +18269,7 @@ snapshots: '@modelcontextprotocol/sdk@1.27.1(zod@3.25.76)': dependencies: - '@hono/node-server': 1.19.11(hono@4.12.5) + '@hono/node-server': 1.19.11(hono@4.12.7) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 @@ -20005,7 +18279,7 @@ snapshots: eventsource-parser: 3.0.6 express: 5.2.1 express-rate-limit: 8.2.1(express@5.2.1) - hono: 4.12.5 + hono: 4.12.7 jose: 6.1.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -20017,7 +18291,7 @@ snapshots: '@modelcontextprotocol/sdk@1.27.1(zod@4.3.6)': dependencies: - '@hono/node-server': 1.19.11(hono@4.12.5) + '@hono/node-server': 1.19.11(hono@4.12.7) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 @@ -20027,7 +18301,7 @@ snapshots: eventsource-parser: 3.0.6 express: 5.2.1 express-rate-limit: 8.2.1(express@5.2.1) - hono: 4.12.5 + hono: 4.12.7 jose: 6.1.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -20060,72 +18334,6 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@nangohq/node@0.69.38': - dependencies: - '@nangohq/types': 0.69.38 - axios: 1.13.5 - transitivePeerDependencies: - - debug - - '@nangohq/types@0.69.38': - dependencies: - axios: 1.13.5 - json-schema: 0.4.0 - type-fest: 4.41.0 - transitivePeerDependencies: - - debug - - '@napi-rs/keyring-darwin-arm64@1.2.0': - optional: true - - '@napi-rs/keyring-darwin-x64@1.2.0': - optional: true - - '@napi-rs/keyring-freebsd-x64@1.2.0': - optional: true - - '@napi-rs/keyring-linux-arm-gnueabihf@1.2.0': - optional: true - - '@napi-rs/keyring-linux-arm64-gnu@1.2.0': - optional: true - - '@napi-rs/keyring-linux-arm64-musl@1.2.0': - optional: true - - '@napi-rs/keyring-linux-riscv64-gnu@1.2.0': - optional: true - - '@napi-rs/keyring-linux-x64-gnu@1.2.0': - optional: true - - '@napi-rs/keyring-linux-x64-musl@1.2.0': - optional: true - - '@napi-rs/keyring-win32-arm64-msvc@1.2.0': - optional: true - - '@napi-rs/keyring-win32-ia32-msvc@1.2.0': - optional: true - - '@napi-rs/keyring-win32-x64-msvc@1.2.0': - optional: true - - '@napi-rs/keyring@1.2.0': - optionalDependencies: - '@napi-rs/keyring-darwin-arm64': 1.2.0 - '@napi-rs/keyring-darwin-x64': 1.2.0 - '@napi-rs/keyring-freebsd-x64': 1.2.0 - '@napi-rs/keyring-linux-arm-gnueabihf': 1.2.0 - '@napi-rs/keyring-linux-arm64-gnu': 1.2.0 - '@napi-rs/keyring-linux-arm64-musl': 1.2.0 - '@napi-rs/keyring-linux-riscv64-gnu': 1.2.0 - '@napi-rs/keyring-linux-x64-gnu': 1.2.0 - '@napi-rs/keyring-linux-x64-musl': 1.2.0 - '@napi-rs/keyring-win32-arm64-msvc': 1.2.0 - '@napi-rs/keyring-win32-ia32-msvc': 1.2.0 - '@napi-rs/keyring-win32-x64-msvc': 1.2.0 - '@napi-rs/wasm-runtime@1.1.1': dependencies: '@emnapi/core': 1.8.1 @@ -20310,11 +18518,6 @@ snapshots: ai: 6.0.116(zod@4.3.6) zod: 4.3.6 - '@openrouter/ai-sdk-provider@2.2.5(ai@6.0.14(zod@4.3.6))(zod@4.3.6)': - dependencies: - ai: 6.0.14(zod@4.3.6) - zod: 4.3.6 - '@opentelemetry/api-logs@0.203.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -20322,607 +18525,17 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@opentelemetry/auto-instrumentations-node@0.62.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-aws-lambda': 0.54.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-aws-sdk': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-bunyan': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-cassandra-driver': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-cucumber': 0.19.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.21.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dns': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fastify': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.23.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.13.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-memcached': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-nestjs-core': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-net': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-oracledb': 0.29.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.56.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pino': 0.50.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-restify': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-router': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-runtime-node': 0.17.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-socket.io': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.14.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-winston': 0.48.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-alibaba-cloud': 0.31.11(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-aws': 2.12.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-azure': 0.10.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-container': 0.7.11(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-gcp': 0.37.0(@opentelemetry/api@1.9.0)(encoding@0.1.13) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - '@opentelemetry/baggage-span-processor@0.4.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) - optional: true - '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 optional: true - '@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - optional: true - - '@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - optional: true - '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 optional: true - '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.40.0 - optional: true - - '@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.40.0 - optional: true - - '@opentelemetry/exporter-jaeger@2.5.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - jaeger-client: 3.19.0 - optional: true - - '@opentelemetry/exporter-logs-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/exporter-logs-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/exporter-logs-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/exporter-metrics-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/exporter-metrics-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/exporter-metrics-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/exporter-prometheus@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/exporter-trace-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/exporter-zipkin@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - optional: true - - '@opentelemetry/instrumentation-amqplib@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-aws-lambda@0.54.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/aws-lambda': 8.10.152 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-aws-sdk@0.58.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-bunyan@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@types/bunyan': 1.8.11 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-cassandra-driver@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-connect@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/connect': 3.4.38 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-cucumber@0.19.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-dataloader@0.21.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-dns@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-express@0.52.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-fastify@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-fs@0.23.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-generic-pool@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-graphql@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-grpc@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-hapi@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-http@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - forwarded-parse: 2.1.2 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-ioredis@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-kafkajs@0.13.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-knex@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-koa@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-lru-memoizer@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-memcached@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/memcached': 2.2.10 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-mongodb@0.56.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-mongoose@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-mysql2@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-mysql@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/mysql': 2.15.27 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-nestjs-core@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-net@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-oracledb@0.29.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/oracledb': 6.5.2 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-pg@0.56.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) - '@types/pg': 8.15.5 - '@types/pg-pool': 2.0.6 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-pino@0.50.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-redis@0.52.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-restify@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-router@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-runtime-node@0.17.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-socket.io@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-tedious@0.22.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/tedious': 4.0.14 - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-undici@0.14.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@opentelemetry/instrumentation-winston@0.48.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - optional: true - '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -20933,103 +18546,18 @@ snapshots: - supports-color optional: true - '@opentelemetry/otlp-exporter-base@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/otlp-grpc-exporter-base@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/otlp-transformer@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - protobufjs: 7.5.4 - optional: true - '@opentelemetry/propagator-b3@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) optional: true - '@opentelemetry/propagator-b3@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - '@opentelemetry/propagator-jaeger@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) optional: true - '@opentelemetry/propagator-jaeger@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/redis-common@0.38.2': - optional: true - - '@opentelemetry/resource-detector-alibaba-cloud@0.31.11(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/resource-detector-aws@2.12.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - optional: true - - '@opentelemetry/resource-detector-azure@0.10.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - optional: true - - '@opentelemetry/resource-detector-container@0.7.11(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/resource-detector-gcp@0.37.0(@opentelemetry/api@1.9.0)(encoding@0.1.13)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - gcp-metadata: 6.1.1(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - supports-color - optional: true - '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -21037,71 +18565,6 @@ snapshots: '@opentelemetry/semantic-conventions': 1.28.0 optional: true - '@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - optional: true - - '@opentelemetry/resources@2.5.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - optional: true - - '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/sdk-metrics@2.5.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/sdk-node@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-prometheus': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-zipkin': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-b3': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - optional: true - '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -21110,22 +18573,6 @@ snapshots: '@opentelemetry/semantic-conventions': 1.28.0 optional: true - '@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - optional: true - - '@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - optional: true - '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -21137,34 +18584,9 @@ snapshots: semver: 7.7.4 optional: true - '@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - optional: true - - '@opentelemetry/sdk-trace-node@2.5.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) - optional: true - '@opentelemetry/semantic-conventions@1.28.0': optional: true - '@opentelemetry/semantic-conventions@1.40.0': - optional: true - - '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - optional: true - '@orama/cuid2@2.2.3': dependencies: '@noble/hashes': 1.8.0 @@ -21411,8 +18833,6 @@ snapshots: '@petamoriken/float16@3.9.3': {} - '@pinojs/redact@0.4.0': {} - '@pkgjs/parseargs@0.11.0': optional: true @@ -21561,35 +18981,6 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@protobuf-ts/runtime-rpc@2.11.1': - dependencies: - '@protobuf-ts/runtime': 2.11.1 - - '@protobuf-ts/runtime@2.11.1': {} - - '@protobufjs/aspromise@1.1.2': {} - - '@protobufjs/base64@1.1.2': {} - - '@protobufjs/codegen@2.0.4': {} - - '@protobufjs/eventemitter@1.1.0': {} - - '@protobufjs/fetch@1.1.0': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - - '@protobufjs/float@1.0.2': {} - - '@protobufjs/inquire@1.1.0': {} - - '@protobufjs/path@1.1.2': {} - - '@protobufjs/pool@1.1.0': {} - - '@protobufjs/utf8@1.1.0': {} - '@publint/pack@0.1.4': {} '@quansync/fs@1.0.0': @@ -23739,27 +21130,6 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@tanstack/react-router': 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/react-start-client': 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/react-start-server': 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/router-utils': 1.161.4 - '@tanstack/start-client-core': 1.163.2 - '@tanstack/start-plugin-core': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - '@tanstack/start-server-core': 1.163.2 - pathe: 2.0.3 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - '@rsbuild/core' - - crossws - - supports-color - - vite-plugin-solid - - webpack - optional: true - '@tanstack/react-start@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tanstack/react-router': 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -23816,29 +21186,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@tanstack/router-core': 1.163.2 - '@tanstack/router-generator': 1.163.2 - '@tanstack/router-utils': 1.161.4 - '@tanstack/virtual-file-routes': 1.161.4 - chokidar: 3.6.0 - unplugin: 2.3.11 - zod: 3.25.76 - optionalDependencies: - '@tanstack/react-router': 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vite-plugin-solid: 2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - transitivePeerDependencies: - - supports-color - optional: true - '@tanstack/router-plugin@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 @@ -23925,26 +21272,6 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/solid-start@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(solid-js@1.9.11)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@tanstack/solid-router': 1.163.2(solid-js@1.9.11) - '@tanstack/solid-start-client': 1.163.2(solid-js@1.9.11) - '@tanstack/solid-start-server': 1.163.2(solid-js@1.9.11) - '@tanstack/start-client-core': 1.163.2 - '@tanstack/start-plugin-core': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - '@tanstack/start-server-core': 1.163.2 - pathe: 2.0.3 - solid-js: 1.9.11 - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - '@rsbuild/core' - - '@tanstack/react-router' - - crossws - - supports-color - - vite-plugin-solid - - webpack - optional: true - '@tanstack/solid-start@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(solid-js@1.9.11)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tanstack/solid-router': 1.163.2(solid-js@1.9.11) @@ -23980,39 +21307,6 @@ snapshots: '@tanstack/start-fn-stubs@1.161.4': {} - '@tanstack/start-plugin-core@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.29.0 - '@babel/types': 7.29.0 - '@rolldown/pluginutils': 1.0.0-beta.40 - '@tanstack/router-core': 1.163.2 - '@tanstack/router-generator': 1.163.2 - '@tanstack/router-plugin': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - '@tanstack/router-utils': 1.161.4 - '@tanstack/start-client-core': 1.163.2 - '@tanstack/start-server-core': 1.163.2 - cheerio: 1.2.0 - exsolve: 1.0.8 - pathe: 2.0.3 - picomatch: 4.0.3 - source-map: 0.7.6 - srvx: 0.11.8 - tinyglobby: 0.2.15 - ufo: 1.6.3 - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.2(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - xmlbuilder2: 4.0.3 - zod: 3.25.76 - transitivePeerDependencies: - - '@rsbuild/core' - - '@tanstack/react-router' - - crossws - - supports-color - - vite-plugin-solid - - webpack - optional: true - '@tanstack/start-plugin-core@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/code-frame': 7.27.1 @@ -24262,9 +21556,6 @@ snapshots: tslib: 2.8.1 optional: true - '@types/aws-lambda@8.10.152': - optional: true - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.0 @@ -24301,11 +21592,6 @@ snapshots: dependencies: bun-types: 1.3.9 - '@types/bunyan@1.8.11': - dependencies: - '@types/node': 25.3.2 - optional: true - '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.2.0 @@ -24506,8 +21792,6 @@ snapshots: '@types/jsesc@2.5.1': {} - '@types/json-schema@7.0.15': {} - '@types/jsrsasign@10.5.15': {} '@types/keyv@3.1.4': @@ -24520,22 +21804,12 @@ snapshots: '@types/mdx@2.0.13': {} - '@types/memcached@2.2.10': - dependencies: - '@types/node': 25.3.2 - optional: true - '@types/micromatch@4.0.10': dependencies: '@types/braces': 3.0.5 '@types/ms@2.1.0': {} - '@types/mysql@2.15.27': - dependencies: - '@types/node': 25.3.2 - optional: true - '@types/nlcst@2.0.3': dependencies: '@types/unist': 3.0.3 @@ -24558,23 +21832,6 @@ snapshots: '@types/offscreencanvas@2019.7.3': {} - '@types/oracledb@6.5.2': - dependencies: - '@types/node': 25.3.2 - optional: true - - '@types/pg-pool@2.0.6': - dependencies: - '@types/pg': 8.16.0 - optional: true - - '@types/pg@8.15.5': - dependencies: - '@types/node': 25.3.2 - pg-protocol: 1.12.0 - pg-types: 2.2.0 - optional: true - '@types/pg@8.16.0': dependencies: '@types/node': 25.3.2 @@ -24635,11 +21892,6 @@ snapshots: '@types/supports-color@8.1.3': {} - '@types/tedious@4.0.14': - dependencies: - '@types/node': 25.3.2 - optional: true - '@types/text-table@0.2.5': {} '@types/three@0.183.1': @@ -24749,8 +22001,6 @@ snapshots: vue: 3.5.29(typescript@5.9.3) vue-router: 4.6.4(vue@3.5.29(typescript@5.9.3)) - '@vercel/functions@1.6.0': {} - '@vercel/nft@1.3.2(encoding@0.1.13)(rollup@4.59.0)': dependencies: '@mapbox/node-pre-gyp': 2.0.3(encoding@0.1.13) @@ -25071,14 +22321,6 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 4.3.6 - ai@6.0.14(zod@4.3.6): - dependencies: - '@ai-sdk/gateway': 3.0.9(zod@4.3.6) - '@ai-sdk/provider': 3.0.2 - '@ai-sdk/provider-utils': 4.0.4(zod@4.3.6) - '@opentelemetry/api': 1.9.0 - zod: 4.3.6 - ajv-formats@3.0.1(ajv@8.18.0): optionalDependencies: ajv: 8.18.0 @@ -25114,9 +22356,6 @@ snapshots: dependencies: string-width: 4.2.3 - ansi-color@0.2.2: - optional: true - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -25207,25 +22446,10 @@ snapshots: aria-query@5.3.1: {} - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - array-iterate@2.0.1: {} array-timsort@1.0.3: {} - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - asap@2.0.6: {} asn1@0.2.6: @@ -25255,8 +22479,6 @@ snapshots: astring@1.9.0: {} - async-function@1.0.0: {} - async-limiter@1.0.1: {} async-sema@3.1.1: {} @@ -25265,17 +22487,11 @@ snapshots: asynckit@0.4.0: {} - atomic-sleep@1.0.0: {} - atomically@2.1.1: dependencies: stubborn-fs: 2.0.0 when-exit: 2.1.5 - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - aws-ssl-profiles@1.1.2: {} axios@1.13.5: @@ -25471,50 +22687,6 @@ snapshots: mailchecker: 6.0.19 validator: 13.15.26 - better-auth@1.4.19(cbf096bc24bc5dd4eee3786e0f4ed2f6): - dependencies: - '@better-auth/core': 1.4.19(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) - '@better-auth/telemetry': 1.4.19(@better-auth/core@1.4.19(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1)) - '@better-auth/utils': 0.3.0 - '@better-fetch/fetch': 1.1.21 - '@noble/ciphers': 2.1.1 - '@noble/hashes': 2.0.1 - better-call: 1.1.8(zod@4.3.6) - defu: 6.1.4 - jose: 6.1.3 - kysely: 0.28.11 - nanostores: 1.1.1 - zod: 4.3.6 - optionalDependencies: - '@lynx-js/react': 0.116.3(@types/react@19.2.14) - '@prisma/client': 7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) - '@sveltejs/kit': 2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - '@tanstack/react-start': 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - '@tanstack/solid-start': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(solid-js@1.9.11)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - better-sqlite3: 12.6.2 - drizzle-kit: 0.31.9 - drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.2))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) - mongodb: 7.1.0(socks@2.8.7) - mysql2: 3.18.2(@types/node@25.3.2) - next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) - pg: 8.19.0 - prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - solid-js: 1.9.11 - svelte: 5.53.5 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vue: 3.5.29(typescript@5.9.3) - - better-call@1.1.8(zod@4.3.6): - dependencies: - '@better-auth/utils': 0.3.1 - '@better-fetch/fetch': 1.1.21 - rou3: 0.7.12 - set-cookie-parser: 2.7.2 - optionalDependencies: - zod: 4.3.6 - better-call@1.3.2(zod@4.3.6): dependencies: '@better-auth/utils': 0.3.1 @@ -25539,9 +22711,6 @@ snapshots: big-integer@1.6.52: {} - bignumber.js@9.3.1: - optional: true - binary-extensions@2.3.0: {} bindings@1.5.0: @@ -25681,14 +22850,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bufrw@1.4.0: - dependencies: - ansi-color: 0.2.2 - error: 7.0.2 - hexer: 1.5.0 - xtend: 4.0.2 - optional: true - bumpp@10.4.1(magicast@0.5.2): dependencies: ansis: 4.2.0 @@ -25793,13 +22954,6 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 @@ -26083,8 +23237,6 @@ snapshots: colorette@1.4.0: optional: true - colorette@2.0.20: {} - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -26584,30 +23736,10 @@ snapshots: data-uri-to-buffer@4.0.1: optional: true - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - date-fns-jalali@4.1.0-0: {} date-fns@4.1.0: {} - dateformat@4.6.3: {} - dax-sh@0.43.2: dependencies: '@deno/shim-deno': 0.19.2 @@ -26687,6 +23819,7 @@ snapshots: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 + optional: true define-lazy-prop@2.0.0: {} @@ -26697,6 +23830,7 @@ snapshots: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 + optional: true defu@6.1.4: {} @@ -26776,10 +23910,6 @@ snapshots: dependencies: dotenv: 16.6.1 - dotenv-expand@12.0.3: - dependencies: - dotenv: 16.6.1 - dotenv@16.4.7: {} dotenv@16.6.1: {} @@ -26825,25 +23955,6 @@ snapshots: postgres: 3.4.8 prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.2))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): - optionalDependencies: - '@cloudflare/workers-types': 4.20260226.1 - '@electric-sql/pglite': 0.3.15 - '@libsql/client': 0.17.0(encoding@0.1.13) - '@opentelemetry/api': 1.9.0 - '@prisma/client': 7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) - '@types/better-sqlite3': 7.6.13 - '@types/pg': 8.16.0 - '@upstash/redis': 1.36.4 - better-sqlite3: 12.6.2 - bun-types: 1.3.9 - gel: 2.2.0 - kysely: 0.28.11 - mysql2: 3.18.2(@types/node@25.3.2) - pg: 8.19.0 - postgres: 3.4.8 - prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260226.1 @@ -26883,11 +23994,6 @@ snapshots: prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) optional: true - drizzle-zod@0.8.3(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.2))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(zod@4.3.6): - dependencies: - drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.2))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) - zod: 4.3.6 - dts-resolver@2.1.3(oxc-resolver@11.19.0): optionalDependencies: oxc-resolver: 11.19.0 @@ -27017,75 +24123,12 @@ snapshots: dependencies: stackframe: 1.3.4 - error@7.0.2: - dependencies: - string-template: 0.2.1 - xtend: 4.0.2 - optional: true - errorhandler@1.5.2: dependencies: accepts: 1.3.8 escape-html: 1.0.3 optional: true - es-abstract@1.24.1: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 - es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -27103,12 +24146,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - es-toolkit@1.44.0: {} es6-error@4.1.1: {} @@ -27407,8 +24444,6 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - exit-hook@4.0.0: {} - expand-template@2.0.3: {} expect-type@1.3.0: {} @@ -27634,8 +24669,6 @@ snapshots: dependencies: pure-rand: 6.1.0 - fast-copy@4.0.2: {} - fast-deep-equal@3.1.3: {} fast-equals@6.0.0: {} @@ -27652,8 +24685,6 @@ snapshots: fast-json-stable-stringify@2.1.0: {} - fast-safe-stringify@2.1.1: {} - fast-sha256@1.3.0: {} fast-uri@3.1.0: {} @@ -27757,12 +24788,6 @@ snapshots: path-exists: 4.0.0 optional: true - find-up@7.0.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - unicorn-magic: 0.1.0 - fkill@9.0.0: dependencies: aggregate-error: 5.0.0 @@ -27780,10 +24805,6 @@ snapshots: fontfaceobserver@2.3.0: {} - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - foreground-child@2.0.0: dependencies: cross-spawn: 7.0.6 @@ -27811,9 +24832,6 @@ snapshots: fetch-blob: 3.2.0 optional: true - forwarded-parse@2.1.2: - optional: true - forwarded@0.2.0: {} foxact@0.2.53(react-dom@19.2.4(react@19.2.4))(react@19.2.4): @@ -28117,39 +25135,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - - gaxios@6.7.1(encoding@0.1.13): - dependencies: - extend: 3.0.2 - https-proxy-agent: 7.0.6 - is-stream: 2.0.1 - node-fetch: 2.7.0(encoding@0.1.13) - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - gcp-metadata@6.1.1(encoding@0.1.13): - dependencies: - gaxios: 6.7.1(encoding@0.1.13) - google-logging-utils: 0.0.2 - json-bigint: 1.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - geist@1.7.0(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)): dependencies: next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) @@ -28169,8 +25154,6 @@ snapshots: dependencies: is-property: 1.0.2 - generator-function@2.0.1: {} - gensequence@8.0.8: {} gensync@1.0.0-beta.2: {} @@ -28211,12 +25194,6 @@ snapshots: get-stream@8.0.1: {} - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - get-tsconfig@4.13.6: dependencies: resolve-pkg-maps: 1.0.0 @@ -28286,6 +25263,7 @@ snapshots: dependencies: define-properties: 1.2.1 gopd: 1.2.0 + optional: true globby@16.1.1: dependencies: @@ -28298,11 +25276,6 @@ snapshots: glsl-noise@0.0.0: {} - google-logging-utils@0.0.2: - optional: true - - google-protobuf@4.0.2: {} - gopd@1.2.0: {} got@11.8.6: @@ -28381,8 +25354,6 @@ snapshots: - bufferutil - utf-8-validate - has-bigints@1.1.0: {} - has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -28390,10 +25361,7 @@ snapshots: has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 + optional: true has-symbols@1.1.0: {} @@ -28535,8 +25503,6 @@ snapshots: headers-polyfill@4.0.3: {} - help-me@5.0.0: {} - hermes-compiler@250829098.0.9: {} hermes-estree@0.29.1: {} @@ -28559,14 +25525,6 @@ snapshots: hex-rgb@4.3.0: {} - hexer@1.5.0: - dependencies: - ansi-color: 0.2.2 - minimist: 1.2.8 - process: 0.10.1 - xtend: 4.0.2 - optional: true - highlight.js@10.7.3: {} highlight.js@11.11.1: {} @@ -28575,7 +25533,7 @@ snapshots: hono@4.11.4: {} - hono@4.12.5: {} + hono@4.12.7: {} hookable@5.5.3: {} @@ -28753,12 +25711,6 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - internmap@1.0.1: {} internmap@2.0.3: {} @@ -28797,55 +25749,19 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-arrayish@0.2.1: {} is-arrayish@0.3.4: optional: true - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-callable@1.2.7: {} - is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-decimal@2.0.1: {} is-docker@2.2.1: {} @@ -28858,23 +25774,11 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - is-fullwidth-code-point@2.0.0: optional: true is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.2: - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -28888,19 +25792,10 @@ snapshots: is-interactive@1.0.0: optional: true - is-map@2.0.3: {} - is-module@1.0.0: {} - is-negative-zero@2.0.3: {} - is-node-process@1.2.0: {} - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-number@7.0.0: {} is-path-inside@4.0.0: {} @@ -28921,56 +25816,17 @@ snapshots: dependencies: '@types/estree': 1.0.8 - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - is-safe-filename@0.1.1: {} - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - is-stream@2.0.1: {} is-stream@3.0.0: {} - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.20 - is-typedarray@1.0.0: {} is-unicode-supported@0.1.0: optional: true - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-what@3.14.1: optional: true @@ -28995,8 +25851,6 @@ snapshots: isarray@1.0.0: {} - isarray@2.0.5: {} - isbot@5.1.35: {} isexe@2.0.0: {} @@ -29064,25 +25918,12 @@ snapshots: transitivePeerDependencies: - '@types/react' - iwanthue@2.0.0: - dependencies: - obliterator: 2.0.5 - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jaeger-client@3.19.0: - dependencies: - node-int64: 0.4.0 - opentracing: 0.14.7 - thriftrw: 3.11.4 - uuid: 8.3.2 - xorshift: 1.2.0 - optional: true - jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 @@ -29161,8 +26002,6 @@ snapshots: jiti@2.6.1: {} - jmespath@0.16.0: {} - joi@17.13.3: dependencies: '@hapi/hoek': 9.3.0 @@ -29181,8 +26020,6 @@ snapshots: '@types/react': 19.2.14 react: 19.2.4 - joycon@3.1.1: {} - jpeg-js@0.4.4: optional: true @@ -29223,11 +26060,6 @@ snapshots: jsesc@3.1.0: {} - json-bigint@1.0.0: - dependencies: - bignumber.js: 9.3.1 - optional: true - json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: @@ -29503,14 +26335,8 @@ snapshots: p-locate: 5.0.0 optional: true - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - lodash-es@4.17.23: {} - lodash.camelcase@4.3.0: {} - lodash.debounce@4.0.8: {} lodash.defaults@4.2.0: {} @@ -29558,9 +26384,6 @@ snapshots: loglevel@1.9.2: {} - long@2.4.0: - optional: true - long@5.3.2: {} longest-streak@3.1.0: {} @@ -30984,19 +27807,6 @@ snapshots: seq-queue: 0.0.5 sqlstring: 2.3.3 - mysql2@3.18.2(@types/node@25.3.2): - dependencies: - '@types/node': 25.3.2 - aws-ssl-profiles: 1.1.2 - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.7.2 - long: 5.3.2 - lru.min: 1.1.4 - named-placeholders: 1.1.6 - sql-escaper: 1.3.3 - optional: true - mysql2@3.18.2(@types/node@25.3.3): dependencies: '@types/node': 25.3.3 @@ -31379,18 +28189,8 @@ snapshots: object-inspect@1.13.4: {} - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - obliterator@2.0.5: {} + object-keys@1.1.1: + optional: true obug@2.1.1: {} @@ -31402,8 +28202,6 @@ snapshots: ohash@2.0.11: {} - on-exit-leak-free@2.1.2: {} - on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -31468,23 +28266,11 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@5.23.2(ws@8.19.0)(zod@4.3.6): - optionalDependencies: - ws: 8.19.0 - zod: 4.3.6 - - openapi3-ts@4.5.0: - dependencies: - yaml: 2.8.2 - openid-client@6.8.2: dependencies: jose: 6.1.3 oauth4webapi: 3.8.5 - opentracing@0.14.7: - optional: true - ora@3.4.0: dependencies: chalk: 2.4.2 @@ -31509,12 +28295,6 @@ snapshots: outvariant@1.4.3: {} - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - oxc-resolver@11.19.0: optionalDependencies: '@oxc-resolver/binding-android-arm-eabi': 11.19.0 @@ -31548,10 +28328,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: - dependencies: - yocto-queue: 1.2.2 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -31561,10 +28337,6 @@ snapshots: p-limit: 3.1.0 optional: true - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - p-map@3.0.0: dependencies: aggregate-error: 3.1.0 @@ -31687,8 +28459,6 @@ snapshots: path-exists@4.0.0: {} - path-exists@5.0.0: {} - path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -31778,46 +28548,6 @@ snapshots: pify@4.0.1: optional: true - pino-abstract-transport@2.0.0: - dependencies: - split2: 4.2.0 - - pino-abstract-transport@3.0.0: - dependencies: - split2: 4.2.0 - - pino-pretty@13.1.3: - dependencies: - colorette: 2.0.20 - dateformat: 4.6.3 - fast-copy: 4.0.2 - fast-safe-stringify: 2.1.1 - help-me: 5.0.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 3.0.0 - pump: 3.0.3 - secure-json-parse: 4.1.0 - sonic-boom: 4.2.1 - strip-json-comments: 5.0.3 - - pino-std-serializers@7.1.0: {} - - pino@9.14.0: - dependencies: - '@pinojs/redact': 0.4.0 - atomic-sleep: 1.0.0 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 2.0.0 - pino-std-serializers: 7.1.0 - process-warning: 5.0.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.5.0 - sonic-boom: 4.2.1 - thread-stream: 3.1.0 - pirates@4.0.7: {} pkce-challenge@5.0.1: {} @@ -31863,8 +28593,6 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 - possible-typed-array-names@1.1.0: {} - postal-mime@2.7.3: {} postcss-selector-parser@7.1.1: @@ -31990,11 +28718,6 @@ snapshots: dependencies: fromentries: 1.3.2 - process-warning@5.0.0: {} - - process@0.10.1: - optional: true - process@0.11.10: {} progress@2.0.3: {} @@ -32037,21 +28760,6 @@ snapshots: proto-list@1.2.4: {} - protobufjs@7.5.4: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 25.3.2 - long: 5.3.2 - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -32084,10 +28792,6 @@ snapshots: pure-rand@6.1.0: {} - pusher-js@8.4.0: - dependencies: - tweetnacl: 1.0.3 - pvtsutils@1.3.6: dependencies: tslib: 2.8.1 @@ -32123,8 +28827,6 @@ snapshots: dependencies: inherits: 2.0.4 - quick-format-unescaped@4.0.4: {} - quick-lru@5.1.1: {} quotation@2.0.3: {} @@ -32489,8 +29191,6 @@ snapshots: readdirp@5.0.0: {} - real-require@0.2.0: {} - recast@0.23.11: dependencies: ast-types: 0.16.1 @@ -32562,17 +29262,6 @@ snapshots: reflect-metadata@0.2.2: {} - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 @@ -32602,15 +29291,6 @@ snapshots: regexp-to-ast@0.5.0: {} - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - regexpu-core@6.4.0: dependencies: regenerate: 1.4.2 @@ -33750,31 +30430,10 @@ snapshots: dependencies: mri: 1.2.0 - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - - safe-stable-stringify@2.5.0: {} - safer-buffer@2.1.2: {} samlify@2.10.2: @@ -33846,8 +30505,6 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 - secure-json-parse@4.1.0: {} - selderee@0.11.0: dependencies: parseley: 0.12.1 @@ -33945,32 +30602,11 @@ snapshots: set-blocking@2.0.0: {} - set-cookie-parser@2.7.2: {} + set-cookie-parser@2.7.2: + optional: true set-cookie-parser@3.0.1: {} - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - setprototypeof@1.2.0: {} sf-symbols-typescript@2.2.0: @@ -34161,10 +30797,6 @@ snapshots: dependencies: solid-js: 1.9.11 - sonic-boom@4.2.1: - dependencies: - atomic-sleep: 1.0.0 - sonner@2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 @@ -34263,11 +30895,6 @@ snapshots: std-env@3.10.0: {} - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - stream-buffers@2.2.0: {} stream-combiner@0.0.4: @@ -34288,9 +30915,6 @@ snapshots: strict-uri-encode@2.0.0: optional: true - string-template@0.2.1: - optional: true - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -34317,29 +30941,6 @@ snapshots: string.prototype.codepointat@0.2.1: {} - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -34622,10 +31223,6 @@ snapshots: dependencies: tslib: 2.8.1 - thread-stream@3.1.0: - dependencies: - real-require: 0.2.0 - three-mesh-bvh@0.8.3(three@0.183.2): dependencies: three: 0.183.2 @@ -34642,13 +31239,6 @@ snapshots: three@0.183.2: {} - thriftrw@3.11.4: - dependencies: - bufrw: 1.4.0 - error: 7.0.2 - long: 2.4.0 - optional: true - throat@5.0.0: {} throttleit@2.1.0: {} @@ -34716,12 +31306,6 @@ snapshots: dependencies: punycode: 2.3.1 - traverse@0.6.11: - dependencies: - gopd: 1.2.0 - typedarray.prototype.slice: 1.0.5 - which-typed-array: 1.1.20 - tree-dump@1.1.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -34755,8 +31339,6 @@ snapshots: '@ts-morph/common': 0.28.1 code-block-writer: 13.0.3 - ts-pattern@5.9.0: {} - tsdown@0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3): dependencies: ansis: 4.2.0 @@ -34845,8 +31427,6 @@ snapshots: tw-animate-css@1.4.0: {} - tweetnacl@1.0.3: {} - type-detect@4.0.8: {} type-fest@0.13.1: @@ -34878,54 +31458,10 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - typedarray.prototype.slice@1.0.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - math-intrinsics: 1.1.0 - typed-array-buffer: 1.0.3 - typed-array-byte-offset: 1.0.4 - typedarray@0.0.6: {} typescript@5.6.1-rc: {} @@ -34956,13 +31492,6 @@ snapshots: ultrahtml@1.6.0: {} - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - unconfig-core@7.5.0: dependencies: '@quansync/fs': 1.0.0 @@ -35021,8 +31550,6 @@ snapshots: pako: 0.2.9 tiny-inflate: 1.0.3 - unicorn-magic@0.1.0: {} - unicorn-magic@0.4.0: {} unified-args@11.0.1: @@ -35271,15 +31798,13 @@ snapshots: uuid@11.1.0: {} - uuid@13.0.0: {} + uuid@13.0.0: + optional: true uuid@7.0.3: {} uuid@8.3.2: {} - uuid@9.0.1: - optional: true - valibot@1.2.0(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -35438,20 +31963,6 @@ snapshots: - xml2js - yaml - vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): - dependencies: - '@babel/core': 7.29.0 - '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.10(@babel/core@7.29.0)(solid-js@1.9.11) - merge-anything: 5.1.7 - solid-js: 1.9.11 - solid-refresh: 0.6.3(solid-js@1.9.11) - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.2(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - transitivePeerDependencies: - - supports-color - optional: true - vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@babel/core': 7.29.0 @@ -35706,49 +32217,8 @@ snapshots: when-exit@2.1.5: {} - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.20 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - which-module@2.0.1: {} - which-typed-array@1.1.20: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -35913,9 +32383,6 @@ snapshots: xmlbuilder@15.1.1: {} - xorshift@1.2.0: - optional: true - xpath@0.0.32: {} xpath@0.0.33: {} @@ -35982,8 +32449,6 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.2: {} - yocto-spinner@0.2.3: dependencies: yoctocolors: 2.1.2 diff --git a/turbo.json b/turbo.json index adc9462b826..2dd4c862f51 100644 --- a/turbo.json +++ b/turbo.json @@ -20,7 +20,13 @@ "dependsOn": ["^build"], "inputs": ["$TURBO_DEFAULT$", ".env*"], "outputs": [".next/**", "!.next/cache/**"], - "passThroughEnv": ["TYPESENSE_ADMIN_API_KEY", "GITHUB_TOKEN"] + "passThroughEnv": [ + "TYPESENSE_ADMIN_API_KEY", + "GITHUB_TOKEN", + "OPENROUTER_API_KEY", + "UPSTASH_REDIS_REST_URL", + "UPSTASH_REDIS_REST_TOKEN" + ] }, "clean": {}, "format": { From 0476620253012b88e3c1815b19a6e6eb8a18cb76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A9l=20Solano?= Date: Fri, 13 Mar 2026 20:47:05 +0100 Subject: [PATCH 62/88] fix(electron): handle safeStorage encryption failures gracefully (#8530) --- packages/electron/src/client.ts | 35 ++++- packages/electron/test/electron.test.ts | 172 ++++++++++++++++++++++-- packages/electron/test/utils.ts | 6 +- 3 files changed, 192 insertions(+), 21 deletions(-) diff --git a/packages/electron/src/client.ts b/packages/electron/src/client.ts index 34994ed8cdc..34e97ba41ac 100644 --- a/packages/electron/src/client.ts +++ b/packages/electron/src/client.ts @@ -25,19 +25,37 @@ import { const { app, safeStorage, webContents } = electron; -const storageAdapter = (storage: Storage) => { +const storageAdapter = (storage: Storage, sessionKeys: Set) => { + const memory = new Map(); + return { ...storage, getDecrypted: (name: string) => { + if (sessionKeys.has(name) && memory.has(name)) { + return memory.get(name) ?? null; + } + + if (!safeStorage.isEncryptionAvailable()) return null; const item = storage.getItem(name); if (!item || typeof item !== "string") return null; - return safeStorage.decryptString(Buffer.from(base64.decode(item))); + try { + return safeStorage.decryptString(Buffer.from(base64.decode(item))); + } catch { + return null; + } }, setEncrypted: (name: string, value: string) => { - return storage.setItem( - name, - base64.encode(safeStorage.encryptString(value)), - ); + if (!safeStorage.isEncryptionAvailable()) { + if (sessionKeys.has(name)) { + memory.set(name, value); + } + return; + } + try { + storage.setItem(name, base64.encode(safeStorage.encryptString(value))); + } catch { + return; + } }, }; }; @@ -56,7 +74,10 @@ export const electronClient = (options: O) => { let store: ClientStore | null = null; const cookieName = `${opts.storagePrefix}.cookie`; const localCacheName = `${opts.storagePrefix}.local_cache`; - const { getDecrypted, setEncrypted } = storageAdapter(opts.storage); + const { getDecrypted, setEncrypted } = storageAdapter( + opts.storage, + new Set([cookieName, localCacheName]), + ); if ( (isDevelopment() || isTest()) && diff --git a/packages/electron/test/electron.test.ts b/packages/electron/test/electron.test.ts index 718b9079baa..7911ced3d8a 100644 --- a/packages/electron/test/electron.test.ts +++ b/packages/electron/test/electron.test.ts @@ -40,6 +40,7 @@ const mockElectron = vi.hoisted(() => { openExternal: vi.fn(), }, safeStorage: { + isEncryptionAvailable: vi.fn(() => true), encryptString: vi.fn((str: string) => Buffer.from(str).toString("base64"), ), @@ -77,7 +78,7 @@ const mockElectron = vi.hoisted(() => { vi.mock("electron", () => mockElectron); describe("Electron", () => { - const { auth, client, proxyClient, options } = testUtils(); + const { auth, client, proxyClient, options, customFetchImpl } = testUtils(); it("should throw error when making requests outside the main process", async ({ setProcessType, @@ -1023,8 +1024,40 @@ describe("Electron", () => { }); describe("cookies", () => { + async function setupSessionWithTokenExchange() { + (globalThis as any)[kElectron] = new Map([ + ["abc", "test-challenge"], + ]); + const { user } = await auth.api.signInEmail({ + body: { email: "test@test.com", password: "password" }, + }); + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + codeChallenge: "test-challenge", + codeChallengeMethod: "plain", + state: "abc", + }), + expiresAt: new Date(Date.now() + 300 * 1000), + }, + }); + await client.$fetch("/electron/token", { + method: "POST", + body: { + token: identifier, + code_verifier: "test-challenge", + state: "abc", + }, + }); + } + it("should send cookie and get session", async ({ setProcessType }) => { setProcessType("browser"); + await setupSessionWithTokenExchange(); const { data } = await client.getSession(); expect(data).toMatchObject({ @@ -1035,7 +1068,10 @@ describe("Electron", () => { expect(mockElectron.safeStorage.decryptString).toHaveBeenCalled(); }); - it("should get cookies", async () => { + it("should get cookies", async ({ setProcessType }) => { + setProcessType("browser"); + await setupSessionWithTokenExchange(); + const c = client.getCookie(); expect(c).includes("better-auth.session_token"); }); @@ -1318,13 +1354,9 @@ describe("Electron", () => { ); }); - it("should surface safeStorage errors during encryption", async ({ - setProcessType, - }) => { + it("should not store when encryption fails", async ({ setProcessType }) => { setProcessType("browser"); - // Create a user and verification entry that would normally trigger - // cookie/session encryption during the token exchange. const { user } = await auth.api.signUpEmail({ body: { name: "Sage Storage Test", @@ -1353,22 +1385,136 @@ describe("Electron", () => { }, }); - // Make encryptString throw mockElectron.safeStorage.encryptString.mockImplementationOnce(() => { throw new Error("encryption failed"); }); - // Expect the token exchange to surface the error (encryption failure) - await expect( - client.$fetch("/electron/token", { + const result = await client.$fetch("/electron/token", { + method: "POST", + body: { + token: identifier, + code_verifier: codeVerifier, + state: "abc", + }, + }); + + expect((result.data as any)?.user).toMatchObject({ + email: "safe-storage@test.com", + name: "Sage Storage Test", + }); + expect(client.getCookie()).not.toMatch( + /better-auth\.session_token=[a-zA-Z0-9_-]{10,}/, + ); + }); + + it("should use memory storage when encryption is unavailable", async ({ + setProcessType, + }) => { + setProcessType("browser"); + mockElectron.safeStorage.isEncryptionAvailable.mockReturnValue(false); + try { + const memoryFallbackStorage = new Map(); + const clientWithStorage = createAuthClient({ + baseURL: "http://localhost:3000", + fetchOptions: { customFetchImpl }, + plugins: [ + electronClient({ + ...options, + storage: { + getItem: (name) => memoryFallbackStorage.get(name) ?? null, + setItem: (name, value) => { + memoryFallbackStorage.set(name, value); + }, + }, + }), + ], + }); + + const { user } = await auth.api.signUpEmail({ + body: { + name: "Memory Storage Test", + email: "memory-storage@test.com", + password: "password", + }, + }); + + const codeVerifier = base64Url.encode(randomBytes(32)); + const codeChallenge = base64Url.encode( + await createHash("SHA-256").digest(codeVerifier), + ); + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + codeChallenge, + codeChallengeMethod: "s256", + state: "abc", + }), + expiresAt: new Date(Date.now() + 300 * 1000), + }, + }); + + const result = await clientWithStorage.$fetch("/electron/token", { method: "POST", body: { token: identifier, code_verifier: codeVerifier, state: "abc", }, - }), - ).rejects.toThrow("encryption failed"); + }); + + expect((result.data as any)?.user).toMatchObject({ + email: "memory-storage@test.com", + name: "Memory Storage Test", + }); + expect(clientWithStorage.getCookie()).toContain( + "better-auth.session_token=", + ); + expect(memoryFallbackStorage.has("better-auth.cookie")).toBe(false); + } finally { + mockElectron.safeStorage.isEncryptionAvailable.mockReturnValue(true); + } + }); + + it("should return null on decrypt failure", async ({ setProcessType }) => { + setProcessType("browser"); + + const cookieStorage = new Map([ + [ + "better-auth.cookie", + Buffer.from('{"session":"old"}').toString("base64"), + ], + ]); + const clientWithStorage = createAuthClient({ + baseURL: "http://localhost:3000", + fetchOptions: { customFetchImpl }, + plugins: [ + electronClient({ + ...options, + storage: { + getItem: (name) => cookieStorage.get(name) ?? null, + setItem: (name, value) => { + cookieStorage.set(name, value); + return true; + }, + }, + }), + ], + }); + + mockElectron.safeStorage.decryptString.mockImplementationOnce(() => { + throw new Error( + "Error while decrypting the ciphertext provided to safeStorage.decryptString.", + ); + }); + + // getCookie() uses getDecrypted internally + const cookie = clientWithStorage.getCookie(); + expect(cookie).toBe(""); }); it("should quit when single instance lock not acquired", async ({ diff --git a/packages/electron/test/utils.ts b/packages/electron/test/utils.ts index e6c759b2158..94cd97f809e 100644 --- a/packages/electron/test/utils.ts +++ b/packages/electron/test/utils.ts @@ -8,7 +8,7 @@ import { createAuthClient } from "better-auth/client"; import { getMigrations } from "better-auth/db/migration"; import { oAuthProxy } from "better-auth/plugins"; import Database from "better-sqlite3"; -import { afterAll, beforeAll, test, vi } from "vitest"; +import { afterAll, afterEach, beforeAll, test, vi } from "vitest"; import { electronClient } from "../src/client"; import { electron } from "../src/index"; import { electronProxyClient } from "../src/proxy"; @@ -109,6 +109,7 @@ function getTestInstance(overrideOpts?: BetterAuthOptions) { client, options, customFetchImpl, + storage, }; } @@ -120,6 +121,9 @@ export function testUtils(overrideOpts?: BetterAuthOptions) { await runMigrations(); vi.useFakeTimers(); }); + afterEach(() => { + testInstance.storage.clear(); + }); afterAll(() => { vi.useRealTimers(); }); From e4331c7db7268d0d01a64d6299e80be5db365930 Mon Sep 17 00:00:00 2001 From: Developer Zeke Date: Fri, 13 Mar 2026 17:14:40 -0400 Subject: [PATCH 63/88] docs: fix import statement in your-first-plugin.mdx (#8598) --- docs/content/docs/guides/your-first-plugin.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/content/docs/guides/your-first-plugin.mdx b/docs/content/docs/guides/your-first-plugin.mdx index 9cc069e95c9..05bf6dd2505 100644 --- a/docs/content/docs/guides/your-first-plugin.mdx +++ b/docs/content/docs/guides/your-first-plugin.mdx @@ -118,8 +118,7 @@ In our case we want to match any requests going to the signup path: And for our logic, weโ€™ll write the following code to check the if userโ€™s birthday makes them above 5 years old. ```ts title="Imports" -import { APIError } from "better-auth/api"; -import { createAuthMiddleware } from "better-auth/plugins"; +import { createAuthMiddleware, APIError } from "better-auth/api"; ``` ```ts title="Before hook" { From f9727cadc19ff9faaf2201cb1a176703f7b892fc Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Fri, 13 Mar 2026 15:39:49 -0700 Subject: [PATCH 64/88] chore: enable global virtual store for git worktree support (#8600) --- pnpm-workspace.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ce3048b48db..ca2938870c5 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,6 +7,8 @@ packages: blockExoticSubdeps: true +enableGlobalVirtualStore: true + catalog: '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 From 8f47015af223e5db9ff406f6ca8247f6b8dcd9fe Mon Sep 17 00:00:00 2001 From: Yanqi Zong Date: Fri, 13 Mar 2026 16:18:14 -0700 Subject: [PATCH 65/88] feat(organization): explicit `organizationId` in team endpoints (#5062) Co-authored-by: Alex Yang --- .../plugins/organization/routes/crud-team.ts | 50 ++++-- .../src/plugins/organization/team.test.ts | 152 ++++++++++++++++++ 2 files changed, 186 insertions(+), 16 deletions(-) diff --git a/packages/better-auth/src/plugins/organization/routes/crud-team.ts b/packages/better-auth/src/plugins/organization/routes/crud-team.ts index 81e8cf12373..d8aa76e9e6c 100644 --- a/packages/better-auth/src/plugins/organization/routes/crud-team.ts +++ b/packages/better-auth/src/plugins/organization/routes/crud-team.ts @@ -912,6 +912,14 @@ const addTeamMemberBodySchema = z.object({ description: "The user Id which represents the user to be added as a member.", }), + + organizationId: z + .string() + .meta({ + description: + "The organization ID which the team falls under. If not provided, it will default to the user's active organization.", + }) + .optional(), }); export const addTeamMember = (options: O) => @@ -967,7 +975,10 @@ export const addTeamMember = (options: O) => const session = ctx.context.session; const adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions); - if (!session.session.activeOrganizationId) { + const organizationId = + ctx.body.organizationId || session.session.activeOrganizationId; + + if (!organizationId) { throw APIError.from( "BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION, @@ -976,7 +987,7 @@ export const addTeamMember = (options: O) => const currentMember = await adapter.findMemberByOrgId({ userId: session.user.id, - organizationId: session.session.activeOrganizationId, + organizationId: organizationId, }); if (!currentMember) { @@ -993,7 +1004,7 @@ export const addTeamMember = (options: O) => permissions: { member: ["update"], }, - organizationId: session.session.activeOrganizationId, + organizationId: organizationId, }, ctx, ); @@ -1007,7 +1018,7 @@ export const addTeamMember = (options: O) => const toBeAddedMember = await adapter.findMemberByOrgId({ userId: ctx.body.userId, - organizationId: session.session.activeOrganizationId, + organizationId: organizationId, }); if (!toBeAddedMember) { @@ -1019,7 +1030,7 @@ export const addTeamMember = (options: O) => const team = await adapter.findTeamById({ teamId: ctx.body.teamId, - organizationId: session.session.activeOrganizationId, + organizationId: organizationId, }); if (!team) { @@ -1029,9 +1040,7 @@ export const addTeamMember = (options: O) => ); } - const organization = await adapter.findOrganizationById( - session.session.activeOrganizationId, - ); + const organization = await adapter.findOrganizationById(organizationId); if (!organization) { throw APIError.from( "BAD_REQUEST", @@ -1091,6 +1100,14 @@ const removeTeamMemberBodySchema = z.object({ userId: z.coerce.string().meta({ description: "The user which should be removed from the team.", }), + + organizationId: z + .string() + .meta({ + description: + "The organization ID which the team falls under. If not provided, it will default to the user's active organization.", + }) + .optional(), }); export const removeTeamMember = (options: O) => @@ -1132,7 +1149,10 @@ export const removeTeamMember = (options: O) => const session = ctx.context.session; const adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions); - if (!session.session.activeOrganizationId) { + const organizationId = + ctx.body.organizationId || session.session.activeOrganizationId; + + if (!organizationId) { throw APIError.from( "BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION, @@ -1141,7 +1161,7 @@ export const removeTeamMember = (options: O) => const currentMember = await adapter.findMemberByOrgId({ userId: session.user.id, - organizationId: session.session.activeOrganizationId, + organizationId: organizationId, }); if (!currentMember) { @@ -1158,7 +1178,7 @@ export const removeTeamMember = (options: O) => permissions: { member: ["delete"], }, - organizationId: session.session.activeOrganizationId, + organizationId: organizationId, }, ctx, ); @@ -1172,7 +1192,7 @@ export const removeTeamMember = (options: O) => const toBeAddedMember = await adapter.findMemberByOrgId({ userId: ctx.body.userId, - organizationId: session.session.activeOrganizationId, + organizationId: organizationId, }); if (!toBeAddedMember) { @@ -1184,7 +1204,7 @@ export const removeTeamMember = (options: O) => const team = await adapter.findTeamById({ teamId: ctx.body.teamId, - organizationId: session.session.activeOrganizationId, + organizationId: organizationId, }); if (!team) { @@ -1194,9 +1214,7 @@ export const removeTeamMember = (options: O) => ); } - const organization = await adapter.findOrganizationById( - session.session.activeOrganizationId, - ); + const organization = await adapter.findOrganizationById(organizationId); if (!organization) { throw APIError.from( "BAD_REQUEST", diff --git a/packages/better-auth/src/plugins/organization/team.test.ts b/packages/better-auth/src/plugins/organization/team.test.ts index e5b14ffcb74..18c9d8af3ae 100644 --- a/packages/better-auth/src/plugins/organization/team.test.ts +++ b/packages/better-auth/src/plugins/organization/team.test.ts @@ -248,6 +248,158 @@ describe("team", async () => { } }); + it("should update a team with explicit organizationId in data", async () => { + // Get current session to ensure new org is different from active org + const currentSession = await client.getSession({ + fetchOptions: { headers }, + }); + const currentActiveOrgId = (currentSession.data?.session as any) + .activeOrganizationId; + + // Create a new organization + const newOrg = await client.organization.create({ + name: "New Test Organization", + slug: "new-test-org", + fetchOptions: { headers }, + }); + + expect(newOrg.data?.id).toBeDefined(); + const newOrgId = newOrg.data?.id as string; + + // Ensure the new org is different from the session's active org + expect(newOrgId).not.toBe(currentActiveOrgId); + + // Create a team in the new organization + const newTeam = await client.organization.createTeam( + { + name: "Team in New Org", + organizationId: newOrgId, + }, + { + headers, + }, + ); + + expect(newTeam.data?.id).toBeDefined(); + expect(newTeam.data?.organizationId).toBe(newOrgId); + const newTeamId = newTeam.data?.id as string; + + // Update the team with explicit organizationId in data + const updatedTeam = await client.organization.updateTeam({ + teamId: newTeamId, + data: { + name: "Updated Team Name", + organizationId: newOrgId, + }, + fetchOptions: { headers }, + }); + + expect(updatedTeam.data?.name).toBe("Updated Team Name"); + expect(updatedTeam.data?.id).toBe(newTeamId); + expect(updatedTeam.data?.organizationId).toBe(newOrgId); + }); + + it("should add and remove team member with explicit organizationId", async () => { + const testOrgId = organizationId; + + // Create a new team specifically for this test + const newTeamRes = await client.organization.createTeam( + { + name: "Team for Member Test", + organizationId: testOrgId, + }, + { + headers, + }, + ); + expect(newTeamRes.data?.id).toBeDefined(); + const testTeamId = newTeamRes.data?.id as string; + + // Get the current user's ID + const currentSession = await client.getSession({ + fetchOptions: { headers }, + }); + const currentUserId = currentSession.data?.user.id as string; + + // Add current user to the team so they can list members + await auth.api.addTeamMember({ + headers, + body: { + userId: currentUserId, + teamId: testTeamId, + organizationId: testOrgId, + }, + }); + + // Create and add a new user + const newUserHeaders = new Headers(); + const newUserRes = await client.signUp.email( + { + email: "teamuser@email.com", + password: "password", + name: "Team User", + }, + { + onSuccess: cookieSetter(newUserHeaders), + }, + ); + + expect(newUserRes.data?.user.id).toBeDefined(); + const newUserId = newUserRes.data?.user.id as string; + + // Add user to organization first + await auth.api.addMember({ + body: { + organizationId: testOrgId, + userId: newUserId, + role: "member", + }, + }); + + // Add team member with explicit organizationId + const addedMember = await auth.api.addTeamMember({ + headers, + body: { + userId: newUserId, + teamId: testTeamId, + organizationId: testOrgId, + }, + }); + + expect(addedMember.teamId).toBe(testTeamId); + expect(addedMember.userId).toBe(newUserId); + + // Verify team member was added by listing team members + const teamMembersBefore = await auth.api.listTeamMembers({ + headers, + query: { + teamId: testTeamId, + }, + }); + expect(teamMembersBefore.some((m) => m.userId === newUserId)).toBe(true); + + // Remove team member with explicit organizationId + const removeRes = await auth.api.removeTeamMember({ + headers, + body: { + userId: newUserId, + teamId: testTeamId, + organizationId: testOrgId, + }, + }); + + expect(removeRes.message).toBe("Team member removed successfully."); + + // Verify team member was removed by listing team members again + const teamMembersAfter = await auth.api.listTeamMembers({ + headers, + query: { + teamId: testTeamId, + }, + }); + expect(teamMembersAfter.some((m) => m.userId === newUserId)).toBe(false); + }); + it("should not be allowed to invite a member to a team that's reached maximum members", async () => { const { auth, signInWithTestUser } = await getTestInstance({ user: { From 77f0d79322eb516f11aa51dddb089cec7ecc25db Mon Sep 17 00:00:00 2001 From: Ivan Cernja Date: Tue, 17 Mar 2026 18:50:00 +0100 Subject: [PATCH 66/88] docs: add Encore integration docs (#7760) --- .cspell/third-party.txt | 1 + docs/content/docs/integrations/encore.mdx | 142 ++++++++++++++++++++++ landing/components/docs/icons.tsx | 13 ++ landing/components/sidebar-content.tsx | 6 + 4 files changed, 162 insertions(+) create mode 100644 docs/content/docs/integrations/encore.mdx diff --git a/.cspell/third-party.txt b/.cspell/third-party.txt index d2db5221ba2..b786d320dcb 100644 --- a/.cspell/third-party.txt +++ b/.cspell/third-party.txt @@ -41,3 +41,4 @@ electronjs wagmi tldts headimgurl +encoredev diff --git a/docs/content/docs/integrations/encore.mdx b/docs/content/docs/integrations/encore.mdx new file mode 100644 index 00000000000..17ae8c557e1 --- /dev/null +++ b/docs/content/docs/integrations/encore.mdx @@ -0,0 +1,142 @@ +--- +title: Encore Integration +description: Integrate Better Auth with Encore. +--- + +Better Auth can be integrated with your [Encore](https://encore.dev) application (an open source TypeScript framework with automated infrastructure and observability). + +Before you start, make sure you have a Better Auth instance configured. If you haven't done that yet, check out the [installation](/docs/installation). + +### Getting Started + +Install the Encore CLI and create a new application. This will scaffold a TypeScript project with the required structure: + +```bash title="Terminal" +brew install encoredev/tap/encore # if you don't have Encore installed +encore app create my-app --example=ts/hello-world +cd my-app +npm install better-auth +``` + +### Mount the handler + +To handle auth requests, mount Better Auth on a catch-all endpoint using Encore's `api.raw()`: + +```ts title="auth/handler.ts" +import { api } from "encore.dev/api"; +import { toNodeHandler } from "better-auth/node"; +import { auth } from "./auth"; // Your Better Auth instance + +export const authHandler = api.raw( + { expose: true, path: "/api/auth/*path", method: "*" }, + toNodeHandler(auth) +); +``` + + +Encore's `api.raw()` provides Node.js request/response types. We use `toNodeHandler` from `better-auth/node` to bridge these to Better Auth's Web API handler. + + +### CORS + +If your frontend runs on a different origin, configure CORS in your `encore.app` file to allow credentials (cookies) to be sent with requests: + +```json title="encore.app" +{ + "id": "your-app", + "global_cors": { + "allow_origins_with_credentials": ["http://localhost:3000"] + } +} +``` + +### Trusted Origins + +When requests come from a different origin, they are blocked by default. Add trusted origins to your Better Auth config: + +```ts title="auth/auth.ts" +export const auth = betterAuth({ + trustedOrigins: ["http://localhost:3000", "https://your-app.com"], + // ... rest of config +}); +``` + +### Local Development + +Start your app with the Encore CLI. Make sure Docker is running as Encore uses it to manage local infrastructure: + +```bash title="Terminal" +encore run +``` + + +Open the local dashboard at `localhost:9400` to see traces for all requests, including auth handler execution and session validation. Useful for debugging auth issues. + + +### Protecting Endpoints + +Encore has a built-in auth handler pattern for protecting endpoints. Create an auth handler that validates Better Auth sessions: + +```ts title="auth/gateway.ts" +import { APIError, Gateway, Header } from "encore.dev/api"; +import { authHandler } from "encore.dev/auth"; +import { auth } from "./auth"; + +interface AuthParams { + authorization: Header<"Authorization">; + cookie: Header<"Cookie">; +} + +interface AuthData { + userID: string; + email: string; + name: string; +} + +const handler = authHandler(async (params: AuthParams): Promise => { + const headers = new Headers(); + if (params.authorization) { + headers.set("Authorization", params.authorization); + } + if (params.cookie) { + headers.set("Cookie", params.cookie); + } + + const session = await auth.api.getSession({ headers }); + + if (!session?.user) { + throw APIError.unauthenticated("invalid session"); + } + + return { + userID: session.user.id, + email: session.user.email, + name: session.user.name, + }; +}); + +export const gateway = new Gateway({ authHandler: handler }); +``` + +Then protect any endpoint with `auth: true`: + +```ts +import { api } from "encore.dev/api"; +import { getAuthData } from "~encore/auth"; + +export const getProfile = api( + { expose: true, auth: true, method: "GET", path: "/profile" }, + async () => { + const authData = getAuthData()!; + return { id: authData.userID, email: authData.email }; + } +); +``` + + +If you want to manage session cookies directly in your Encore endpoints, check out Encore's [typed cookie support](https://encore.dev/docs/ts/primitives/cookies). + + +### Learn More + +For a complete walkthrough including database setup and deployment, see the [Better Auth with Encore tutorial](https://encore.dev/blog/betterauth-tutorial). diff --git a/landing/components/docs/icons.tsx b/landing/components/docs/icons.tsx index 2ab8af13690..cc78fc830ba 100644 --- a/landing/components/docs/icons.tsx +++ b/landing/components/docs/icons.tsx @@ -176,6 +176,19 @@ export const Icons = { ), + encore: () => ( + + + + ), nestJS: (props?: SVGProps) => ( Date: Tue, 17 Mar 2026 15:37:15 -0700 Subject: [PATCH 67/88] fix(docs): add missing Encore icon to sidebar icons (#8663) --- landing/components/icons/index.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/landing/components/icons/index.tsx b/landing/components/icons/index.tsx index a3dd3e5bb6f..410607e4280 100644 --- a/landing/components/icons/index.tsx +++ b/landing/components/icons/index.tsx @@ -609,4 +609,18 @@ export const Icons = { /> ), + encore: (props?: SVGProps) => ( + + + + ), }; From 4f37ac4e36b778f89ac3a66af74455cd8e5d4f9f Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Tue, 17 Mar 2026 19:00:55 +0900 Subject: [PATCH 68/88] docs: fix DatabaseTable type mapping and correct schema mismatches (#8611) Co-authored-by: Cursor Agent Co-authored-by: Taesu --- docs/content/docs/concepts/database.mdx | 1 + docs/content/docs/concepts/rate-limit.mdx | 19 ++-- .../docs/guides/next-auth-migration-guide.mdx | 1 + docs/content/docs/plugins/2fa.mdx | 4 +- .../docs/plugins/api-key/reference.mdx | 5 +- .../docs/plugins/device-authorization.mdx | 19 +--- docs/content/docs/plugins/oauth-provider.mdx | 42 ++++---- docs/content/docs/plugins/oidc-provider.mdx | 97 ++++++++++--------- docs/content/docs/plugins/organization.mdx | 5 + docs/content/docs/plugins/scim.mdx | 10 +- docs/content/docs/plugins/sso.mdx | 18 ++-- docs/content/docs/plugins/stripe.mdx | 6 +- docs/content/docs/plugins/username.mdx | 5 +- landing/components/docs/mdx-components.tsx | 33 ++++++- 14 files changed, 148 insertions(+), 117 deletions(-) diff --git a/docs/content/docs/concepts/database.mdx b/docs/content/docs/concepts/database.mdx index 068718f6470..e8a51173bc1 100644 --- a/docs/content/docs/concepts/database.mdx +++ b/docs/content/docs/concepts/database.mdx @@ -337,6 +337,7 @@ Table Name: `user` name: "email", type: "string", description: "User's email address for communication and login", + isUnique: true, }, { name: "emailVerified", diff --git a/docs/content/docs/concepts/rate-limit.mdx b/docs/content/docs/concepts/rate-limit.mdx index b7c950987fc..663aacff98b 100644 --- a/docs/content/docs/concepts/rate-limit.mdx +++ b/docs/content/docs/concepts/rate-limit.mdx @@ -291,18 +291,19 @@ Table Name: `rateLimit` isPrimaryKey: true }, { - name: "key", - type: "string", + name: "key", + type: "string", description: "Unique identifier for each rate limit key", + isUnique: true, }, { - name: "count", - type: "integer", - description: "Time window in seconds" + name: "count", + type: "integer", + description: "Number of requests made in the current window" }, - { - name: "lastRequest", - type: "bigint", - description: "Max requests in the window" + { + name: "lastRequest", + type: "bigint", + description: "Timestamp of the last request (epoch ms)" }]} /> diff --git a/docs/content/docs/guides/next-auth-migration-guide.mdx b/docs/content/docs/guides/next-auth-migration-guide.mdx index b03ac610d0d..2d0bfd43642 100644 --- a/docs/content/docs/guides/next-auth-migration-guide.mdx +++ b/docs/content/docs/guides/next-auth-migration-guide.mdx @@ -382,6 +382,7 @@ Just like Auth.js has database models, Better Auth also has a core schema. In th name: "email", type: "string", description: "User's email address for communication and login", + isUnique: true, }, { name: "emailVerified", diff --git a/docs/content/docs/plugins/2fa.mdx b/docs/content/docs/plugins/2fa.mdx index dab2dfb073f..5f66b4a7c23 100644 --- a/docs/content/docs/plugins/2fa.mdx +++ b/docs/content/docs/plugins/2fa.mdx @@ -482,8 +482,8 @@ Table: `twoFactor` fields={[ { name: "id", type: "string", description: "The ID of the two factor authentication.", isPrimaryKey: true }, { name: "userId", type: "string", description: "The ID of the user", isForeignKey: true }, - { name: "secret", type: "string", description: "The secret used to generate the TOTP code.", isOptional: true }, - { name: "backupCodes", type: "string", description: "The backup codes used to recover access to the account if the user loses access to their phone or email.", isOptional: true }, + { name: "secret", type: "string", description: "The secret used to generate the TOTP code." }, + { name: "backupCodes", type: "string", description: "The backup codes used to recover access to the account if the user loses access to their phone or email." }, ]} /> diff --git a/docs/content/docs/plugins/api-key/reference.mdx b/docs/content/docs/plugins/api-key/reference.mdx index af25739fc78..bf22a9a8da4 100644 --- a/docs/content/docs/plugins/api-key/reference.mdx +++ b/docs/content/docs/plugins/api-key/reference.mdx @@ -497,11 +497,13 @@ Table: `apikey` name: "enabled", type: "boolean", description: "Whether the API key is enabled.", + isOptional: true, }, { name: "rateLimitEnabled", type: "boolean", description: "Whether the API key has rate limiting enabled.", + isOptional: true, }, { name: "rateLimitTimeWindow", @@ -521,6 +523,7 @@ Table: `apikey` type: "number", description: "The number of requests made within the rate limit time window.", + isOptional: true, }, { name: "remaining", @@ -558,7 +561,7 @@ Table: `apikey` }, { name: "metadata", - type: "Object", + type: "string", isOptional: true, description: "Any additional metadata you want to store with the key.", }, diff --git a/docs/content/docs/plugins/device-authorization.mdx b/docs/content/docs/plugins/device-authorization.mdx index f89d0a72be0..b1643430a5b 100644 --- a/docs/content/docs/plugins/device-authorization.mdx +++ b/docs/content/docs/plugins/device-authorization.mdx @@ -611,12 +611,11 @@ Table Name: `deviceCode` type: "string", description: "The user-friendly code for verification", }, - { - name: "userId", - type: "string", + { + name: "userId", + type: "string", description: "The ID of the user who approved/denied", - isOptional: true, - isForeignKey: true + isOptional: true }, { name: "clientId", @@ -652,15 +651,5 @@ Table Name: `deviceCode` description: "Minimum seconds between polls", isOptional: true }, - { - name: "createdAt", - type: "Date", - description: "When the request was created", - }, - { - name: "updatedAt", - type: "Date", - description: "When the request was last updated", - } ]} /> diff --git a/docs/content/docs/plugins/oauth-provider.mdx b/docs/content/docs/plugins/oauth-provider.mdx index ca152c0e346..2b0e2b021be 100644 --- a/docs/content/docs/plugins/oauth-provider.mdx +++ b/docs/content/docs/plugins/oauth-provider.mdx @@ -1601,7 +1601,7 @@ Table Name: `oauthClient` name: "clientId", type: "string", description: "Unique identifier for each OAuth client", - isPrimaryKey: true, + isUnique: true, }, { name: "clientSecret", @@ -1652,17 +1652,18 @@ Table Name: `oauthClient` type: "string", description: "ID of the reference of the client owner if not a user. (optional)", isOptional: true, - isForeignKey: true, }, { name: "createdAt", type: "Date", description: "Timestamp of when the OAuth client was created", + isOptional: true, }, { name: "updatedAt", type: "Date", description: "Timestamp of when the OAuth client was last updated", + isOptional: true, }, { name: "name", @@ -1722,7 +1723,12 @@ Table Name: `oauthClient` name: "redirectUris", type: "string[]", description: "Array of of redirect uris", - isRequired: true, + }, + { + name: "postLogoutRedirectUris", + type: "string[]", + description: "Array of post-logout redirect URIs", + isOptional: true, }, { name: "tokenEndpointAuthMethod", @@ -1754,6 +1760,12 @@ Table Name: `oauthClient` description: "Type of OAuth client. Supports: ['web', 'native', 'user-agent-based']", isOptional: true, }, + { + name: "requirePKCE", + type: "boolean", + description: "Whether PKCE is required for this client", + isOptional: true, + }, { name: "metadata", type: "json", @@ -1779,14 +1791,12 @@ Table Name: `oauthRefreshToken` name: "token", type: "string", description: "Hashed/encrypted refresh token", - isRequired: true, }, { name: "clientId", type: "string", description: "ID of the OAuth client", isForeignKey: true, - isRequired: true, references: { model: "oauthClient", field: "clientId" }, }, { @@ -1794,7 +1804,7 @@ Table Name: `oauthRefreshToken` type: "string", description: "ID of the session used at issuance of the token (and still active)", isForeignKey: true, - isRequired: false, + isOptional: true, references: { model: "session", field: "id" }, }, { @@ -1802,7 +1812,6 @@ Table Name: `oauthRefreshToken` type: "string", description: "ID of the user associated with the token", isForeignKey: true, - isRequired: true, references: { model: "user", field: "id" }, }, { @@ -1810,13 +1819,11 @@ Table Name: `oauthRefreshToken` type: "string", description: "ID of the consented reference", isOptional: true, - isForeignKey: true, }, { name: "scopes", type: "string[]", description: "Array of granted scopes", - isRequired: true, }, { name: "revoked", @@ -1859,14 +1866,13 @@ Table Name: `oauthAccessToken` name: "token", type: "string", description: "Hashed/encrypted access token", - isRequired: true, + isUnique: true, }, { name: "clientId", type: "string", description: "ID of the OAuth client", isForeignKey: true, - isRequired: true, references: { model: "oauthClient", field: "clientId" } }, { @@ -1898,18 +1904,16 @@ Table Name: `oauthAccessToken` type: "string", description: "ID of the consented reference", isOptional: true, - isForeignKey: true, }, { name: "scopes", type: "string[]", description: "Array of granted scopes", - isRequired: true, }, { name: "createdAt", type: "Date", - description: "Timestamp when the token was created" + description: "Timestamp when the token was created", }, { name: "expiresAt", @@ -1950,23 +1954,21 @@ Table Name: `oauthConsent` type: "string", description: "ID of the consented reference", isOptional: true, - isForeignKey: true, }, { name: "scopes", - type: "string", - description: "Comma-separated list of scopes consented to", - isRequired: true + type: "string[]", + description: "Array of scopes consented to", }, { name: "createdAt", type: "Date", - description: "Timestamp of when the consent was given" + description: "Timestamp of when the consent was given", }, { name: "updatedAt", type: "Date", - description: "Timestamp of when the consent was last updated" + description: "Timestamp of when the consent was last updated", }, ]} /> diff --git a/docs/content/docs/plugins/oidc-provider.mdx b/docs/content/docs/plugins/oidc-provider.mdx index a0079b36223..019caae91a5 100644 --- a/docs/content/docs/plugins/oidc-provider.mdx +++ b/docs/content/docs/plugins/oidc-provider.mdx @@ -453,11 +453,11 @@ Table Name: `oauthApplication` description: "Database ID of the OAuth client", isPrimaryKey: true }, - { - name: "clientId", - type: "string", + { + name: "clientId", + type: "string", description: "Unique identifier for each OAuth client", - isPrimaryKey: true + isUnique: true }, { name: "clientSecret", @@ -465,17 +465,21 @@ Table Name: `oauthApplication` description: "Secret key for the OAuth client. Optional for public clients using PKCE.", isOptional: true }, - { - name: "name", - type: "string", - description: "Name of the OAuth client", - isRequired: true + { + name: "icon", + type: "string", + description: "Icon of the OAuth client", + isOptional: true + }, + { + name: "name", + type: "string", + description: "Name of the OAuth client" }, { name: "redirectUrls", type: "string", - description: "Comma-separated list of redirect URLs", - isRequired: true + description: "Comma-separated list of redirect URLs" }, { name: "metadata", @@ -486,26 +490,26 @@ Table Name: `oauthApplication` { name: "type", type: "string", - description: "Type of OAuth client (e.g., web, mobile)", - isRequired: true + description: "Type of OAuth client (e.g., web, mobile)" }, - { - name: "disabled", - type: "boolean", + { + name: "disabled", + type: "boolean", description: "Indicates if the client is disabled", - isRequired: true + isOptional: true }, { - name: "userId", - type: "string", + name: "userId", + type: "string", description: "ID of the user who owns the client. (optional)", isOptional: true, + isForeignKey: true, references: { model: "user", field: "id" } }, - { - name: "createdAt", - type: "Date", - description: "Timestamp of when the OAuth client was created" + { + name: "createdAt", + type: "Date", + description: "Timestamp of when the OAuth client was created" }, { name: "updatedAt", @@ -528,27 +532,26 @@ Table Name: `oauthAccessToken` isPrimaryKey: true }, { - name: "accessToken", - type: "string", + name: "accessToken", + type: "string", description: "Access token issued to the client", + isUnique: true }, { - name: "refreshToken", - type: "string", + name: "refreshToken", + type: "string", description: "Refresh token issued to the client", - isRequired: true + isUnique: true }, { name: "accessTokenExpiresAt", type: "Date", - description: "Expiration date of the access token", - isRequired: true + description: "Expiration date of the access token" }, { name: "refreshTokenExpiresAt", type: "Date", - description: "Expiration date of the refresh token", - isRequired: true + description: "Expiration date of the refresh token" }, { name: "clientId", @@ -558,22 +561,22 @@ Table Name: `oauthAccessToken` references: { model: "oauthApplication", field: "clientId" } }, { - name: "userId", - type: "string", + name: "userId", + type: "string", description: "ID of the user associated with the token", + isOptional: true, isForeignKey: true, references: { model: "user", field: "id" } }, { name: "scopes", type: "string", - description: "Comma-separated list of scopes granted", - isRequired: true + description: "Comma-separated list of scopes granted" }, - { - name: "createdAt", - type: "Date", - description: "Timestamp of when the access token was created" + { + name: "createdAt", + type: "Date", + description: "Timestamp of when the access token was created" }, { name: "updatedAt", @@ -612,19 +615,17 @@ Table Name: `oauthConsent` { name: "scopes", type: "string", - description: "Comma-separated list of scopes consented to", - isRequired: true + description: "Comma-separated list of scopes consented to" }, { name: "consentGiven", type: "boolean", - description: "Indicates if consent was given", - isRequired: true + description: "Indicates if consent was given" }, - { - name: "createdAt", - type: "Date", - description: "Timestamp of when the consent was given" + { + name: "createdAt", + type: "Date", + description: "Timestamp of when the consent was given" }, { name: "updatedAt", diff --git a/docs/content/docs/plugins/organization.mdx b/docs/content/docs/plugins/organization.mdx index b287d40e25e..d7aef44f62c 100644 --- a/docs/content/docs/plugins/organization.mdx +++ b/docs/content/docs/plugins/organization.mdx @@ -2138,6 +2138,7 @@ Table Name: `teamMember` name: "createdAt", type: "Date", description: "Timestamp of when the team member was created", + isOptional: true, }, ]} /> @@ -2167,6 +2168,7 @@ Table Name: `organization` name: "slug", type: "string", description: "The slug of the organization", + isUnique: true, }, { name: "logo", @@ -2258,6 +2260,7 @@ Table Name: `invitation` name: "role", type: "string", description: "The role of the user in the organization", + isOptional: true, }, { name: "status", @@ -2349,6 +2352,7 @@ Table Name: `organizationRole` name: "updatedAt", type: "Date", description: "Timestamp of when the organization role was updated", + isOptional: true, }, ]} /> @@ -2416,6 +2420,7 @@ Table Name: `teamMember` name: "createdAt", type: "Date", description: "Timestamp of when the team member was created", + isOptional: true, }, ]} /> diff --git a/docs/content/docs/plugins/scim.mdx b/docs/content/docs/plugins/scim.mdx index cbcb51a635d..d19ae9f7e4b 100644 --- a/docs/content/docs/plugins/scim.mdx +++ b/docs/content/docs/plugins/scim.mdx @@ -455,11 +455,11 @@ The plugin requires additional fields in the `scimProvider` table to store the p @@ -469,7 +469,7 @@ The `scimProvider` schema is extended as follows: diff --git a/docs/content/docs/plugins/sso.mdx b/docs/content/docs/plugins/sso.mdx index dfa325e9fb2..b0446724212 100644 --- a/docs/content/docs/plugins/sso.mdx +++ b/docs/content/docs/plugins/sso.mdx @@ -1406,15 +1406,15 @@ The plugin requires additional fields in the `ssoProvider` table to store the pr @@ -1424,7 +1424,7 @@ The `ssoProvider` schema is extended as follows: diff --git a/docs/content/docs/plugins/stripe.mdx b/docs/content/docs/plugins/stripe.mdx index e474b589ab0..5f4e70aea3c 100644 --- a/docs/content/docs/plugins/stripe.mdx +++ b/docs/content/docs/plugins/stripe.mdx @@ -739,9 +739,9 @@ Table Name: `subscription` description: "The Stripe subscription ID", isOptional: true }, - { - name: "status", - type: "string", + { + name: "status", + type: "string", description: "The status of the subscription (active, canceled, etc.)", defaultValue: "incomplete" }, diff --git a/docs/content/docs/plugins/username.mdx b/docs/content/docs/plugins/username.mdx index ae2c274ccc0..507ce823943 100644 --- a/docs/content/docs/plugins/username.mdx +++ b/docs/content/docs/plugins/username.mdx @@ -345,13 +345,14 @@ The plugin requires 2 fields to be added to the user table: name: "username", type: "string", description: "The username of the user", - isUnique: true + isUnique: true, + isOptional: true }, { name: "displayUsername", type: "string", description: "Non normalized username of the user", - isUnique: true + isOptional: true }, ]} /> diff --git a/landing/components/docs/mdx-components.tsx b/landing/components/docs/mdx-components.tsx index 71596a8d038..069dce73446 100644 --- a/landing/components/docs/mdx-components.tsx +++ b/landing/components/docs/mdx-components.tsx @@ -95,10 +95,26 @@ interface Field { isPrimaryKey?: boolean; isForeignKey?: boolean; isOptional?: boolean; + isUnique?: boolean; } +const typeAliases: Record = { + text: "string", + integer: "number", + int: "number", + bigint: "number", + float: "number", + double: "number", + decimal: "number", + bool: "boolean", + object: "json", + timestamp: "date", + datetime: "date", +}; + function TypeIcon({ type }: { type: string }) { - const t = type.toLowerCase().replace("[]", ""); + const raw = type.toLowerCase().replace("[]", ""); + const t = typeAliases[raw] ?? raw; const className = "size-3 shrink-0"; if (t === "string" || t === "text") { @@ -202,7 +218,17 @@ type DrizzleProvider = "pg" | "mysql" | "sqlite"; function fieldToDBField(field: Field): DBFieldAttribute { const t = field.type.toLowerCase(); - const type = (t === "text" ? "string" : t) as DBFieldAttribute["type"]; + const isArray = t.endsWith("[]"); + const raw = isArray ? t.slice(0, -2) : t; + const aliased = typeAliases[raw] ?? raw; + const type = ( + isArray && (aliased === "string" || aliased === "number") + ? `${aliased}[]` + : isArray + ? t + : aliased + ) as DBFieldAttribute["type"]; + const bigint = raw === "bigint"; let references: DBFieldAttribute["references"] | undefined; if (field.isForeignKey && field.name.endsWith("Id")) { @@ -218,7 +244,8 @@ function fieldToDBField(field: Field): DBFieldAttribute { type, required: field.isPrimaryKey ? true : !field.isOptional, references, - unique: false, + unique: field.isUnique ?? false, + bigint, }; } From 3ef439d95b8f6714e8ef65622463fb13abc94b90 Mon Sep 17 00:00:00 2001 From: Enguerrand des Vaux Date: Mon, 16 Mar 2026 21:31:15 +0100 Subject: [PATCH 69/88] docs: fix import order in `organization.mdx` (#8642) --- docs/content/docs/plugins/organization.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/docs/plugins/organization.mdx b/docs/content/docs/plugins/organization.mdx index d7aef44f62c..de2ceb7b24d 100644 --- a/docs/content/docs/plugins/organization.mdx +++ b/docs/content/docs/plugins/organization.mdx @@ -647,9 +647,9 @@ type setActiveOrganization = { To automatically set an active organization when a session is created, you can use [database hooks](/docs/concepts/database#database-hooks). You'll need to implement logic to determine which organization to set as the initial active organization. ```ts title="auth.ts" -export const auth = betterAuth({ - import { betterAuth } from "better-auth"; +import { betterAuth } from "better-auth"; +export const auth = betterAuth({ databaseHooks: { session: { create: { From 7ff412eaf0719efdfd74cc264dd8ec65cfd4259b Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:40:00 +0900 Subject: [PATCH 70/88] docs: soften readme feature grid borders (#8666) --- landing/components/landing/hero-readme.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/landing/components/landing/hero-readme.tsx b/landing/components/landing/hero-readme.tsx index 6cae66a1afd..cdabad796e0 100644 --- a/landing/components/landing/hero-readme.tsx +++ b/landing/components/landing/hero-readme.tsx @@ -1565,7 +1565,7 @@ export function HeroReadMe({
-
+
{[ { label: "Framework Agnostic", @@ -1654,7 +1654,7 @@ export function HeroReadMe({ } }} className={cn( - "group/card relative p-4 lg:p-5 border-foreground/[0.15] min-h-[180px] transition-all duration-200 hover:bg-foreground/[0.02] hover:shadow-[inset_0_1px_0_0_rgba(128,128,128,0.1)] hover:z-10", + "group/card relative p-4 lg:p-5 border-foreground/[0.08] min-h-[180px] transition-all duration-200 hover:bg-foreground/[0.02] hover:shadow-[inset_0_1px_0_0_rgba(128,128,128,0.1)] hover:z-10", // Bottom border: all except last; 3-col last row starts at 6 i < 8 && "border-b", i >= 6 && "md:border-b-0", From a24bdce5985c203b45fa52ffa7bf232db8f1ec89 Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:40:10 +0900 Subject: [PATCH 71/88] docs: correct contributor count mismatch (#8667) Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- landing/app/page.tsx | 1 + landing/components/landing/hero-readme.tsx | 23 ++++++++++++++-------- landing/lib/community-stats.ts | 6 ++++-- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/landing/app/page.tsx b/landing/app/page.tsx index 931fc1c5847..b9074708ffe 100644 --- a/landing/app/page.tsx +++ b/landing/app/page.tsx @@ -71,6 +71,7 @@ export default async function HomePage() { stats={{ npmDownloads: communityStats.npmDownloads, githubStars: communityStats.githubStars, + contributors: communityStats.contributors, }} />
diff --git a/landing/components/landing/hero-readme.tsx b/landing/components/landing/hero-readme.tsx index cdabad796e0..56cb0d3551a 100644 --- a/landing/components/landing/hero-readme.tsx +++ b/landing/components/landing/hero-readme.tsx @@ -1216,10 +1216,18 @@ function SentinelSection() { const EMPTY_CONTRIBUTORS: ContributorInfo[] = []; +type CommunityHeroStats = { + npmDownloads: number; + githubStars: number; + contributors: number; +}; + function ContributorsSection({ contributors = EMPTY_CONTRIBUTORS, + contributorCount, }: { contributors: ContributorInfo[]; + contributorCount: number; }) { if (contributors.length === 0) return null; @@ -1245,7 +1253,7 @@ function ContributorsSection({

Built by a community of{" "} - 746+ + {contributorCount}+ {" "} contributors.

@@ -1335,11 +1343,7 @@ const footerLinks = [ { label: "Changelog", href: "/changelog" }, ]; -function ReadmeFooter({ - stats, -}: { - stats: { npmDownloads: number; githubStars: number }; -}) { +function ReadmeFooter({ stats }: { stats: CommunityHeroStats }) { return (
{/* Watermark logo */} @@ -1516,7 +1520,7 @@ export function HeroReadMe({ stats, }: { contributors: ContributorInfo[]; - stats: { npmDownloads: number; githubStars: number }; + stats: CommunityHeroStats; }) { const [socialHovered, setSocialHovered] = useState(false); @@ -2522,7 +2526,10 @@ export function HeroReadMe({
- + diff --git a/landing/lib/community-stats.ts b/landing/lib/community-stats.ts index 87005f05ad6..0be45cba580 100644 --- a/landing/lib/community-stats.ts +++ b/landing/lib/community-stats.ts @@ -18,6 +18,8 @@ export function getContributors(): ContributorInfo[] { return staticContributors as ContributorInfo[]; } +const staticContributorsCount = staticContributors.length; + // Fetch NPM download stats for the last year async function fetchNpmDownloads(): Promise { try { @@ -75,7 +77,7 @@ async function fetchGitHubStats(): Promise<{ console.error("Failed to fetch GitHub repo stats:", repoResponse.status); } - let contributorsCount = 100; + let contributorsCount = staticContributorsCount; if (contributorsResponse.ok) { const linkHeader = contributorsResponse.headers.get("Link"); if (linkHeader) { @@ -94,7 +96,7 @@ async function fetchGitHubStats(): Promise<{ return { stars, contributors: contributorsCount }; } catch (error) { console.error("Error fetching GitHub stats:", error); - return { stars: 26000, contributors: 100 }; + return { stars: 26000, contributors: staticContributorsCount }; } } From e8b2fb2d59821e84f14b56080d82e42fd47ac743 Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Wed, 18 Mar 2026 19:36:57 +0900 Subject: [PATCH 72/88] docs: polish community page UX (#8673) --- landing/app/community/community-client.tsx | 43 ++++++++-------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/landing/app/community/community-client.tsx b/landing/app/community/community-client.tsx index a9847131efc..c2f01b9b2db 100644 --- a/landing/app/community/community-client.tsx +++ b/landing/app/community/community-client.tsx @@ -205,7 +205,7 @@ const platforms = [ function CommunityHero({ stats }: { stats: CommunityStats }) { return ( {formatNumber(stats.npmDownloads)} - /mo + /year

@@ -266,7 +266,7 @@ function CommunityHero({ stats }: { stats: CommunityStats }) { ].map((item, i) => ( ))} - - {/* CTA */} -
- - - Star on GitHub - -
); @@ -317,7 +304,7 @@ function StatCard({ }) { return ( -
+
- +

{subtext} - +

@@ -353,7 +340,7 @@ function PlatformCard({ return ( -
+
{platform.cta} @@ -423,11 +410,11 @@ export function CommunityPageClient({ stats }: { stats: CommunityStats }) { {/* Section: Statistics */} -

+

# In Numbers

@@ -465,11 +452,11 @@ export function CommunityPageClient({ stats }: { stats: CommunityStats }) { {/* Section: Platforms */} -

+

# Join Us On

@@ -486,7 +473,7 @@ export function CommunityPageClient({ stats }: { stats: CommunityStats }) { {/* Merch */} @@ -494,7 +481,7 @@ export function CommunityPageClient({ stats }: { stats: CommunityStats }) { href="https://better-merch.dev" target="_blank" rel="noreferrer" - className="flex items-center justify-between w-full px-5 py-4 border border-dashed border-foreground/[0.08] hover:border-foreground/[0.14] hover:bg-foreground/[0.02] transition-all group" + className="flex items-center justify-between w-full px-5 py-4 border border-dashed border-foreground/20 hover:border-foreground/30 hover:bg-foreground/5 transition-all group" >
Date: Wed, 18 Mar 2026 19:37:48 +0900 Subject: [PATCH 73/88] docs: use moonshotai/kimi-k2.5 model for ai-chat (#8674) --- landing/lib/ai-chat/route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/landing/lib/ai-chat/route.ts b/landing/lib/ai-chat/route.ts index 3a80ee41050..31d80a0a55a 100644 --- a/landing/lib/ai-chat/route.ts +++ b/landing/lib/ai-chat/route.ts @@ -8,7 +8,7 @@ import { checkRateLimit, getClientIP } from "./rate-limit"; const openrouter = createOpenRouter({ apiKey: process.env.OPENROUTER_API_KEY, }); -const chatModel = openrouter.chat("anthropic/claude-sonnet-4"); +const chatModel = openrouter.chat("moonshotai/kimi-k2.5"); function buildDocsIndex(): string { const pages = source.getPages(); From 79504dc684bd0b75190aa713cca25f3520fa6d65 Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Thu, 19 Mar 2026 07:37:17 +0900 Subject: [PATCH 74/88] docs: improve Blog page UI (#8683) --- landing/app/blog/[[...slug]]/page.tsx | 77 ++++----------------- landing/components/blog/blog-left-panel.tsx | 57 ++++++--------- 2 files changed, 36 insertions(+), 98 deletions(-) diff --git a/landing/app/blog/[[...slug]]/page.tsx b/landing/app/blog/[[...slug]]/page.tsx index 24f3f76ee07..920c4d04cb8 100644 --- a/landing/app/blog/[[...slug]]/page.tsx +++ b/landing/app/blog/[[...slug]]/page.tsx @@ -46,9 +46,9 @@ function BlogList() { href={`/blog/${post.slugs.join("/")}`} className="group block border-b border-dashed border-foreground/[0.06] px-5 sm:px-6 lg:px-8 py-5 transition-colors hover:bg-foreground/[0.02]" > -
+
{post.data?.image && ( -
+
{post.data.title} )}
-

+

{post.data.title}

{post.data.description && ( -

+

{post.data.description}

)} -
+
{post.data.author?.name && ( <> @@ -77,20 +77,14 @@ function BlogList() { )} {formatDate(post.data.date)} - {post.data.tags && post.data.tags.length > 0 && ( - <> - · - {post.data.tags.slice(0, 3).map((tag: string) => ( - - #{tag} - - ))} - - )}
+ {post.data.tags && post.data.tags.length > 0 && ( +
+ {post.data.tags.slice(0, 3).map((tag: string) => ( + #{tag} + ))} +
+ )}
→ @@ -138,52 +132,7 @@ export default async function Page({ {/* Right panel โ€” blog content */}
-
- {/* Header */} -

- {title} -

- {description && ( -

- {description} -

- )} - - {/* Author & date */} -
- {page.data?.author?.name && ( - - {page.data.author.name} - - )} - {page.data?.author?.twitter && ( - <> - · - - @{page.data.author.twitter} - - - )} - {date && ( - <> - · - - - )} -
- -
- +
{/* Article body */}
- {/* Mobile: just a back link */} -
- - - - - - All posts - - -
- {/* Desktop: full panel with title, meta, TOC */} -
+
-
-

+
+

{post.title}

{post.description && ( -

+

{post.description}

)}
-
+
{post.author?.name && ( {post.author.name} )} - {post.author?.name && post.date && ( - · + {post.author?.twitter && ( + <> + · + + @{post.author.twitter} + + + )} + {post.date && ( + <> + · + {formatDate(post.date)} + )} - {post.date && {formatDate(post.date)}}

From a0b53212aa266e0c8d160c6e0c5edbaacabdc81c Mon Sep 17 00:00:00 2001 From: Bereket Engida <86073083+Bekacru@users.noreply.github.com> Date: Thu, 19 Mar 2026 12:18:34 -0700 Subject: [PATCH 75/88] feat: agent auth plugin (#8696) Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- .cspell/custom-words.txt | 3 + docs/content/docs/plugins/agent-auth.mdx | 531 +++++++++++++++ docs/content/docs/plugins/index.mdx | 1 + docs/content/docs/plugins/meta.json | 45 ++ landing/app/page.tsx | 2 +- landing/components/landing/hero-title.tsx | 31 +- landing/components/sidebar-content.tsx | 7 + landing/package.json | 2 +- packages/cli/src/commands/ai.ts | 781 ++++++++++++++++++++++ packages/cli/src/index.ts | 2 + 10 files changed, 1399 insertions(+), 6 deletions(-) create mode 100644 docs/content/docs/plugins/agent-auth.mdx create mode 100644 docs/content/docs/plugins/meta.json create mode 100644 packages/cli/src/commands/ai.ts diff --git a/.cspell/custom-words.txt b/.cspell/custom-words.txt index ec455a40502..d8f1c5cda1d 100644 --- a/.cspell/custom-words.txt +++ b/.cspell/custom-words.txt @@ -15,3 +15,6 @@ myapp Neue CCPA CPRA +tmcp +ciba +CIBA \ No newline at end of file diff --git a/docs/content/docs/plugins/agent-auth.mdx b/docs/content/docs/plugins/agent-auth.mdx new file mode 100644 index 00000000000..0e471735bb3 --- /dev/null +++ b/docs/content/docs/plugins/agent-auth.mdx @@ -0,0 +1,531 @@ +--- +title: Agent Auth +description: Agent identity, registration, discovery, and capability-based authorization for AI agents. +--- + +`AI Agents` `MCP` `Capabilities` + +The Agent Auth plugin lets your Better Auth server act as an **Agent Auth provider**. It's a server implementation of the [Agent Auth Protocol](https://agentauthprotocol.com). + +It gives AI agents a standard way to discover your service, register themselves, request approval, and execute scoped capabilities using short-lived signed JWTs. It comes with adapters for **OpenAPI** and **MCP** โ€” so you can turn an existing REST API or MCP server into an agent-auth-enabled service without writing capabilities by hand. + +## Features + +- **OpenAPI adapter** โ€” derive capabilities, input/output schemas, and a proxy `onExecute` handler directly from an OpenAPI 3.x spec +- **MCP adapter** โ€” expose agent auth as MCP tools so any MCP-compatible AI agent can discover and call your capabilities +- Discovery document at `/.well-known/agent-configuration` +- Capability listing, description, and execution (optional per-capability `location` URLs) +- Delegated and autonomous agent modes +- Device authorization and CIBA approval flows +- Short-lived signed JWTs with replay protection +- Audit/event hooks for approvals, grants, and execution + +## Installation + + + + ### Install the packages + + ```package-install + @better-auth/agent-auth + ``` + + Client and CLI packages (optional): + + ```bash + npm install @auth/agent @auth/agent-cli + ``` + + + + ### Add the plugin to your auth config + + Start by defining the capabilities your service exposes and an `onExecute` handler that performs the action for an authenticated agent. + + ```ts title="auth.ts" + import { betterAuth } from "better-auth"; + import { agentAuth } from "@better-auth/agent-auth"; // [!code highlight] + + export const auth = betterAuth({ + plugins: [ + agentAuth({ // [!code highlight] + providerName: "Acme", // [!code highlight] + providerDescription: "Acme project and deployment APIs for AI agents.", // [!code highlight] + modes: ["delegated", "autonomous"], // [!code highlight] + capabilities: [ // [!code highlight] + { // [!code highlight] + name: "deploy_project", // [!code highlight] + description: "Deploy a project to production.", // [!code highlight] + input: { // [!code highlight] + type: "object", // [!code highlight] + properties: { // [!code highlight] + projectId: { type: "string" }, // [!code highlight] + }, // [!code highlight] + required: ["projectId"], // [!code highlight] + }, // [!code highlight] + }, // [!code highlight] + { // [!code highlight] + name: "list_projects", // [!code highlight] + description: "List projects the current user can access.", // [!code highlight] + }, // [!code highlight] + ], // [!code highlight] + async onExecute({ capability, arguments: args, agentSession }) { // [!code highlight] + switch (capability) { // [!code highlight] + case "list_projects": // [!code highlight] + return [{ id: "proj_123", name: "marketing-site" }]; // [!code highlight] + case "deploy_project": // [!code highlight] + return { // [!code highlight] + ok: true, // [!code highlight] + projectId: args?.projectId, // [!code highlight] + requestedBy: agentSession.user.id, // [!code highlight] + }; // [!code highlight] + default: // [!code highlight] + throw new Error(`Unsupported capability: ${capability}`); // [!code highlight] + } // [!code highlight] + }, // [!code highlight] + }), // [!code highlight] + ], // [!code highlight] + }); // [!code highlight] + ``` + + + + ### Expose the discovery document + + The plugin provides `auth.api.getAgentConfiguration()`, but you should expose it from your app root at `/.well-known/agent-configuration`. + + ```ts title="app/.well-known/agent-configuration/route.ts" + import { auth } from "@/lib/auth"; + import { NextResponse } from "next/server"; + + export async function GET() { + const configuration = await auth.api.getAgentConfiguration(); + return NextResponse.json(configuration); + } + ``` + + + + ### Migrate the database + + Run the migration or generate the schema to add the agent, host, grant, and approval tables. + + + + ```package-install + npx auth migrate + ``` + + + ```package-install + npx auth generate + ``` + + + + + + ### Optional: add the Better Auth client plugin + + If you want type-safe access to the plugin endpoints from a Better Auth client, add the client plugin too. + + ```ts title="auth-client.ts" + import { createAuthClient } from "better-auth/client"; + import { agentAuthClient } from "@better-auth/agent-auth/client"; // [!code highlight] + + export const authClient = createAuthClient({ + plugins: [ + agentAuthClient(), // [!code highlight] + ], + }); + ``` + + + +## How It Works + +The Agent Auth flow usually looks like this: + +1. An agent discovers your provider from `/.well-known/agent-configuration` +2. The agent lists capabilities and decides what it needs +3. The agent registers with your server and requests capability grants +4. Your user approves the request through device authorization or CIBA +5. The agent signs short-lived JWTs (with an `aud` that matches the URL it calls) and invokes each granted capability at **`default_location`** or at that capabilityโ€™s own **`location`**, if you set one + +## Discovery + +The discovery document tells agents how to interact with your server. The plugin includes provider metadata, supported modes, approval methods, absolute endpoint URLs, and a **`default_location`** field. + +Important fields for execution: + +- **`issuer`** โ€” The providerโ€™s base URL (Better Auth `baseURL`). +- **`endpoints`** โ€” Absolute URLs for each route (for example `execute` points at `POST /capability/execute` on that base). +- **`default_location`** โ€” The full URL of the default execute endpoint. It always matches `endpoints.execute`. Agents use this as the JWT **`aud`** when a capability does not define a custom URL, and as the request URL for those capabilities. + +Expose it from your app root: + +```ts title="app/.well-known/agent-configuration/route.ts" +import { auth } from "@/lib/auth"; +import { NextResponse } from "next/server"; + +export async function GET() { + const configuration = await auth.api.getAgentConfiguration(); + return NextResponse.json(configuration); +} +``` + + + The discovery route should live at `/.well-known/agent-configuration`, even if your Better Auth base path is `/api/auth`. + + +## OpenAPI Adapter + +If your service already has an OpenAPI spec, you can turn the entire API into an agent-auth provider in a few lines. **`createFromOpenAPI`** reads the spec and produces everything the plugin needs: capabilities (one per `operationId`), input/output JSON Schemas, a proxy **`onExecute`** handler, and optionally **`providerName`** / **`providerDescription`** from `info`. + +```ts title="auth.ts" +import { betterAuth } from "better-auth"; +import { agentAuth } from "@better-auth/agent-auth"; +import { createFromOpenAPI } from "@better-auth/agent-auth/openapi"; + +const spec = await fetch("https://api.example.com/openapi.json").then((r) => + r.json(), +); + +export const auth = betterAuth({ + plugins: [ + agentAuth({ + ...createFromOpenAPI(spec, { + baseUrl: "https://api.example.com", + }), + }), + ], +}); +``` + +That is all it takes. Every operation with an `operationId` in the spec becomes a capability whose name is that id. Path, query, and header parameters plus the JSON request body are merged into a single `input` schema, and the 200/201 response body becomes `output`. + +### Upstream authentication + +The proxy handler calls your upstream API on behalf of the agent. Use **`resolveHeaders`** to inject the credentials each request needs (for example an internal service token or a user-scoped access token looked up from `agentSession`). + +```ts title="auth.ts" +createFromOpenAPI(spec, { + baseUrl: "https://api.example.com", + async resolveHeaders({ agentSession }) { + const token = await getAccessToken(agentSession.user.id); + return { Authorization: `Bearer ${token}` }; + }, +}); +``` + +### Default host capabilities + +Control which capabilities are auto-granted to new hosts. You can pass `true` (all), a single HTTP method string, an array of methods, or a callback that receives the full runtime context. + +```ts title="auth.ts" +createFromOpenAPI(spec, { + baseUrl: "https://api.example.com", + defaultHostCapabilities: ["GET", "HEAD"], +}); +``` + +### Approval strength per method + +Map HTTP methods to **`approvalStrength`** so mutating operations require stronger user verification (for example WebAuthn) while reads use a normal session. + +```ts title="auth.ts" +createFromOpenAPI(spec, { + baseUrl: "https://api.example.com", + approvalStrength: { + GET: "session", + POST: "webauthn", + PUT: "webauthn", + DELETE: "webauthn", + }, +}); +``` + +### Per-capability `location` + +When you set **`location`**, every derived capability gets that URL. Agents call it directly (with the agent JWT) instead of going through the default execute endpointโ€”useful when you want the agent to hit the real API URL and handle the session in your own middleware rather than proxying through `onExecute`. + +```ts title="auth.ts" +createFromOpenAPI(spec, { + baseUrl: "https://api.example.com", + location: "https://api.example.com/agent/execute", +}); +``` + +### Using the pieces individually + +If you only need part of the pipeline, the adapter also exports the lower-level helpers: + +- **`fromOpenAPI(spec)`** โ€” returns `Capability[]` only (no handler, no host caps). +- **`createOpenAPIHandler(spec, opts)`** โ€” returns only the `onExecute` proxy handler so you can pair it with hand-written capabilities or filter the spec yourself. + +```ts title="auth.ts" +import { + fromOpenAPI, + createOpenAPIHandler, +} from "@better-auth/agent-auth/openapi"; + +const capabilities = fromOpenAPI(spec); +const onExecute = createOpenAPIHandler(spec, { + baseUrl: "https://api.example.com", +}); + +agentAuth({ capabilities, onExecute }); +``` + +## Capabilities + +Capabilities are the contract between your application and an agent. Each capability has a name, a description, and optionally a JSON Schema `input` definition. + +By default, agents call **`default_location`** from discovery (the execute URL) and the plugin runs **`onExecute`**. If you set **`location`** on a capability, agents call that absolute URL insteadโ€”for example an existing REST routeโ€”and **`onExecute` is not used** for those requests; you resolve the agent session with the helpers below and implement the handler yourself. + +Use capabilities to expose narrow, reviewable actions instead of broad API access. + +### Define capabilities + +```ts title="auth.ts" +agentAuth({ + capabilities: [ + { + name: "create_issue", + description: "Create an issue in the current workspace.", + input: { + type: "object", + properties: { + title: { type: "string" }, + body: { type: "string" }, + }, + required: ["title"], + }, + }, + ], +}); +``` + +Optional **`location`** โ€” agents call this URL with the agent JWT instead of the default execute URL: + +```ts title="auth.ts" +{ + name: "create_issue", + description: "Create an issue in the current workspace.", + location: "https://api.example.com/v1/issues", +} +``` + +### Default execute vs custom `location` + +- **No `location`** โ€” Agents `POST` to **`default_location`** (`endpoints.execute`) with `{ capability, arguments }`. After the plugin validates the JWT and grant, it runs **`onExecute`**. +- **With `location`** โ€” Agents call that URL (your REST handler, another service, an OpenAPI operation URL, etc.). **`onExecute` does not run** for that call. Resolve **`agentSession`** in your handler using the helpers below, then enforce grants and your business logic. + +### Agent session outside `onExecute` + +For custom **`location`** routes (or any non-execute handler), the agent still sends an **`Authorization: Bearer`** header with the agent JWT. Whatever framework you use, take the incoming **`Headers`** (e.g. **`request.headers`**, or your runtimeโ€™s equivalent) and pass them throughโ€”the verification path is the same: signature, **`aud`**, replay (**`jti`**), expiry, and (when present) request-binding claims. + +**`auth.api.getAgentSession({ headers })`** runs that flow in-process and returns **`AgentSession`** or **`null`**. **`verifyAgentRequest(request, auth)`** does the same by forwarding the **`Request`**โ€™s headers to **`GET /agent/session`** via **`auth.handler`**โ€”pick whichever fits your code shape; there is no Hono-vs-Next split, only โ€œheaders in, session out.โ€ + +```ts title="api/issues/route.ts" +import { auth } from "@/lib/auth"; + +export async function POST(request: Request) { + const agentSession = await auth.api.getAgentSession({ + headers: request.headers, + }); + if (!agentSession) { + return new Response("Unauthorized", { status: 401 }); + } + // Check grants, enforce constraints, run your handlerโ€ฆ +} +``` + +```ts +// Equivalent when you already have `Request` + `auth` and prefer a helper: +import { verifyAgentRequest } from "@better-auth/agent-auth"; +const agentSession = await verifyAgentRequest(request, auth); +``` + +**Checking grants and inputs** + +After you have **`agentSession`**, inspect **`agentSession.agent.capabilityGrants`**. These are **active** DB grants **intersected** with the JWTโ€™s **`capabilities`** claim (same as execute). For the capability this route implements, ensure there is a matching grant: + +```ts +const CAP = "create_issue"; +const allowed = agentSession.agent.capabilityGrants.some( + (g) => g.capability === CAP && g.status === "active", +); +if (!allowed) { + return new Response("Forbidden", { status: 403 }); +} +``` + +If that grant has **`constraints`**, validate the request body or query the same way **`POST /capability/execute`** wouldโ€”otherwise a client could bypass constraints by calling your custom URL. The plugin does not re-run executeโ€™s constraint helpers on arbitrary routes; that logic stays in your handler (or call into shared code you extract from your **`onExecute`** path). + +**What you get on the session** + +- **`agentSession.user`** โ€” Resolved user for the agent (delegated host user or **`resolveAutonomousUser`**). +- **`agentSession.agent`** โ€” Id, name, mode, **`capabilityGrants`**, host id, metadata. +- **`agentSession.host`** โ€” Host record when the agent is linked to a host. + +Types are exported from **`@better-auth/agent-auth`** (for example **`AgentSession`**). + +### JWT audience (`aud`) + +The JWT **`aud`** must match what the server expects for the URL being called: + +- **No per-capability `location`** โ€” Use **`default_location`** / **`endpoints.execute`**, or issuer / base URL values the plugin already allows. +- **With `location`** โ€” **`aud`** should be that same absolute URL. `GET /capability/list` includes `location` when set. Invalid `location` values in config fail at startup. + +**Single capability in the JWT** โ€” If `capabilities` lists exactly one id, **`aud`** may equal that capabilityโ€™s **`location`** when set. + +**Multiple capabilities in the JWT** โ€” Per-capability **`location`** values are not accepted as **`aud`**; use the issuer, base path, or default execute endpoint instead. + +Behind a reverse proxy, set **`trustProxy`** if you need **`Host`** / **`X-Forwarded-Proto`** to line up with **`aud`** validation. + +### Filter visible capabilities + +Use `resolveCapabilities` to show different capability sets to different callers, such as plan-gated, user-specific, or organization-specific capabilities. + +### `onExecute` + +Runs for capabilities that use the **default execute URL** (no per-capability **`location`**). The plugin verifies the JWT (including **`aud`**), attaches **`agentSession`**, checks the grant, then calls **`onExecute`**. Capabilities with a custom **`location`** never hit this pathโ€”you handle them in your own route using the session helpers above. + +```ts title="auth.ts" +agentAuth({ + capabilities: [ + { + name: "create_issue", + description: "Create an issue in the current workspace.", + }, + ], + async onExecute({ capability, arguments: args, agentSession }) { + if (capability !== "create_issue") { + throw new Error("Unsupported capability"); + } + + return { + ok: true, + title: args?.title, + createdBy: agentSession.user.id, + }; + }, +}); +``` + +## Approval Flows + +The plugin supports two approval methods: + +- `device_authorization` for browser-based approval with a user code +- `ciba` for backchannel approval flows + +By default, both are enabled. You can restrict or customize them with `approvalMethods` and `resolveApprovalMethod`. + +```ts title="auth.ts" +agentAuth({ + approvalMethods: ["ciba", "device_authorization"], + resolveApprovalMethod: ({ preferredMethod, supportedMethods }) => { + if (preferredMethod && supportedMethods.includes(preferredMethod)) { + return preferredMethod; + } + return "device_authorization"; + }, + deviceAuthorizationPage: "/device/capabilities", +}); +``` + + + The plugin does not render the device approval UI for you. Your app must provide the page referenced by `deviceAuthorizationPage`. + + + +## Events and Auditing + +Use `onEvent` to capture important lifecycle events such as: + +- agent creation and revocation +- host creation and enrollment +- capability requests and approvals +- capability execution + +This hook is a good place to write audit logs or feed analytics pipelines. + +## Configuration + +The Agent Auth plugin supports many options. These are the ones you will usually start with: + + + diff --git a/docs/content/docs/plugins/index.mdx b/docs/content/docs/plugins/index.mdx index 945d1e74155..0fb932603c1 100644 --- a/docs/content/docs/plugins/index.mdx +++ b/docs/content/docs/plugins/index.mdx @@ -35,6 +35,7 @@ Better Auth ships with 50+ plugins that extend the framework with additional aut | Plugin | Description | | --- | --- | +| [Agent Auth](/docs/plugins/agent-auth) New | Discovery, registration, and capability-based authorization for AI agents | | [API Key](/docs/plugins/api-key) | API key generation and management | | [JWT](/docs/plugins/jwt) | JSON Web Token authentication for services | | [Bearer](/docs/plugins/bearer) | Bearer token authentication for API requests | diff --git a/docs/content/docs/plugins/meta.json b/docs/content/docs/plugins/meta.json new file mode 100644 index 00000000000..1e44f66ec99 --- /dev/null +++ b/docs/content/docs/plugins/meta.json @@ -0,0 +1,45 @@ +{ + "title": "Plugins", + "pages": [ + "index", + "2fa", + "passkey", + "magic-link", + "email-otp", + "phone-number", + "anonymous", + "username", + "one-tap", + "siwe", + "generic-oauth", + "multi-session", + "last-login-method", + "admin", + "organization", + "sso", + "scim", + "agent-auth", + "api-key", + "jwt", + "bearer", + "one-time-token", + "oauth-proxy", + "oauth-provider", + "oidc-provider", + "mcp", + "device-authorization", + "stripe", + "polar", + "autumn", + "creem", + "commet", + "dodopayments", + "captcha", + "have-i-been-pwned", + "i18n", + "open-api", + "test-utils", + "dub", + "community-plugins" + ] +} diff --git a/landing/app/page.tsx b/landing/app/page.tsx index b9074708ffe..df935d109dc 100644 --- a/landing/app/page.tsx +++ b/landing/app/page.tsx @@ -10,7 +10,7 @@ export default async function HomePage() { return (
-
+
{/* Left side โ€” Hero title */}
diff --git a/landing/components/landing/hero-title.tsx b/landing/components/landing/hero-title.tsx index 51d6913b1e2..c9b51fd6bbf 100644 --- a/landing/components/landing/hero-title.tsx +++ b/landing/components/landing/hero-title.tsx @@ -24,7 +24,12 @@ export function HeroTitle() { className="relative z-[2] w-full py-16 flex flex-col justify-center h-full pointer-events-none" >
- + +

The most comprehensive authentication framework for{" "} diff --git a/landing/components/sidebar-content.tsx b/landing/components/sidebar-content.tsx index 211504d0fc6..a3279b8efe8 100644 --- a/landing/components/sidebar-content.tsx +++ b/landing/components/sidebar-content.tsx @@ -4,6 +4,7 @@ import { AppWindow, Binoculars, Book, + BotIcon, CircleHelp, Database, FlaskConical, @@ -1790,6 +1791,12 @@ C0.7,239.6,62.1,0.5,62.2,0.4c0,0,54,13.8,119.9,30.8S302.1,62,302.2,62c0.2,0,0.2, ), }, + { + title: "Agent Auth", + href: "/docs/plugins/agent-auth", + icon: () => , + isNew: true, + }, { title: "API Key", href: "/docs/plugins/api-key", diff --git a/landing/package.json b/landing/package.json index 027a5e5fca6..fd1207b0c53 100644 --- a/landing/package.json +++ b/landing/package.json @@ -5,7 +5,7 @@ "private": true, "scripts": { "postinstall": "fumadocs-mdx", - "dev": "next dev --turbopack --port 3000", + "dev": "next dev --port 3000", "build": "next build", "postbuild": "pnpm sync-typesense", "start": "next start", diff --git a/packages/cli/src/commands/ai.ts b/packages/cli/src/commands/ai.ts new file mode 100644 index 00000000000..ef817719bff --- /dev/null +++ b/packages/cli/src/commands/ai.ts @@ -0,0 +1,781 @@ +import { execSync } from "node:child_process"; +import * as fs from "node:fs"; +import * as os from "node:os"; +import * as path from "node:path"; +import chalk from "chalk"; +import { Command } from "commander"; +import prompts from "prompts"; +import yoctoSpinner from "yocto-spinner"; + +const PROTOCOL_URL = "https://agent-auth-protocol.com"; +const AGENT_CLI_PKG = "@auth/agent-cli"; +const AGENT_PLUGIN_PKG = "@better-auth/agent-auth"; +const DEFAULT_REGISTRY = "https://agent-auth.directory"; +const SKILLS_REPO = "better-auth/agent-auth"; + +interface McpEntry { + command: string; + args: string[]; +} + +function cancelled(): never { + console.log(chalk.yellow("\nโœ‹ Setup cancelled.")); + process.exit(0); +} + +function check(value: T | undefined): T { + if (value === undefined || value === null) cancelled(); + return value; +} + +// โ”€โ”€ Main โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +async function aiAction() { + console.log( + "\n" + + [ + ` โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆ`, + ` โ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ ${chalk.bold("Agent Auth")} ${chalk.dim("Setup")}`, + ` โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆ ${chalk.gray("AI agent authentication & capability-based authorization.")}`, + ].join("\n"), + ); + console.log(); + + const { setup } = await prompts({ + type: "select", + name: "setup", + message: "What would you like to do?", + choices: [ + { + title: "Integrate Agent Auth client", + value: "client", + description: "MCP server, CLI, or SDK for your agents", + }, + { + title: "Create an Agent Auth server", + value: "server", + description: "expose capabilities from your service to AI agents", + }, + ], + }); + + check(setup); + + if (setup === "client") { + await setupClient(); + } else { + await setupServerSelection(); + } +} + +// โ”€โ”€ Client Integration โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +async function setupClient() { + const { method } = await prompts({ + type: "select", + name: "method", + message: "How do you want to integrate?", + choices: [ + { + title: "MCP Server", + value: "mcp", + description: "for AI tools โ€” Claude, Cursor, Windsurf, etc.", + }, + { + title: "CLI", + value: "cli", + description: "command-line tool for agent workflows", + }, + ], + }); + + check(method); + + if (method === "mcp") { + await setupMcp(); + } else { + await setupCli(); + } +} + +// โ”€โ”€ Server Selection โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +async function setupServerSelection() { + const { implementation } = await prompts({ + type: "select", + name: "implementation", + message: "Choose an implementation", + choices: [ + { + title: "Better Auth + Agent Auth", + value: "better-auth", + description: "TypeScript", + }, + ], + }); + + check(implementation); + + await setupServer(); +} + +// โ”€โ”€ MCP Server Setup โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +async function setupMcp() { + const { tool } = await prompts({ + type: "select", + name: "tool", + message: "Which AI tool?", + choices: [ + { title: "Cursor", value: "cursor" }, + { title: "Claude Code", value: "claude-code" }, + { title: "Claude Desktop", value: "claude-desktop" }, + { title: "Windsurf", value: "windsurf" }, + { title: "VS Code / Copilot", value: "vscode" }, + { title: "Open Code", value: "opencode" }, + { title: "Other", value: "other" }, + ], + }); + check(tool); + + let scope: "project" | "global" = "global"; + + if (tool === "cursor" || tool === "vscode") { + const hintProject = + tool === "cursor" ? ".cursor/mcp.json" : ".vscode/mcp.json"; + const hintGlobal = + tool === "cursor" ? "~/.cursor/mcp.json" : "user settings"; + const { s } = await prompts({ + type: "select", + name: "s", + message: "Where should it be configured?", + choices: [ + { + title: "This project", + value: "project", + description: hintProject, + }, + { + title: "Global (all projects)", + value: "global", + description: hintGlobal, + }, + ], + }); + check(s); + scope = s; + } + + const { registryUrl } = await prompts({ + type: "text", + name: "registryUrl", + message: "Registry URL", + initial: DEFAULT_REGISTRY, + }); + + const registry = registryUrl?.trim() || DEFAULT_REGISTRY; + const mcpArgs = buildMcpArgs(registry); + + if (tool === "claude-code") { + await setupClaudeCode(mcpArgs); + } else if (tool === "opencode") { + await setupOpenCode(mcpArgs); + } else if (tool === "other") { + const entry: McpEntry = { command: "npx", args: mcpArgs }; + showJsonConfig(entry); + } else { + await writeMcpConfigInteractive(tool, scope, mcpArgs); + } + + await offerSkillInstall("agent-auth-mcp"); + + showNextSteps([ + `${chalk.cyan("Docs")} ${PROTOCOL_URL}/docs/integrate-client`, + `${chalk.cyan("GitHub")} https://github.com/better-auth/agent-auth`, + ]); + + console.log( + chalk.green("\nโœ” ") + + chalk.bold("Done! ") + + "Restart your AI tool to connect.\n", + ); +} + +async function setupClaudeCode(args: string[]) { + const { scope } = await prompts({ + type: "select", + name: "scope", + message: "Where should it be configured?", + choices: [ + { + title: "This project", + value: "project", + description: "--scope project", + }, + { + title: "Global (all projects)", + value: "user", + description: "--scope user", + }, + ], + }); + check(scope); + + const cmdParts = [ + "claude", + "mcp", + "add", + "agent-auth", + "--scope", + scope, + "--", + "npx", + ...args, + ]; + const cmd = cmdParts.join(" "); + + console.log(chalk.bold.white("\nRun this command:")); + console.log(chalk.cyan(` ${cmd}\n`)); + + const { run } = await prompts({ + type: "confirm", + name: "run", + message: "Run it now?", + initial: true, + }); + + if (run) { + const s = yoctoSpinner({ + text: "Adding MCP server to Claude Codeโ€ฆ", + color: "white", + }); + s.start(); + try { + execSync(cmd, { stdio: "pipe" }); + s.success("Added to Claude Code."); + } catch { + s.stop(); + console.log(chalk.yellow("โš  Could not run the command automatically.")); + console.log(chalk.gray(" Run the command above manually.")); + } + } +} + +async function setupOpenCode(args: string[]) { + const configPath = path.join(process.cwd(), "opencode.json"); + const display = "opencode.json"; + + const openCodeEntry = { + type: "stdio" as const, + command: "npx", + args, + enabled: true, + }; + + const { write } = await prompts({ + type: "confirm", + name: "write", + message: `Write config to ${chalk.cyan(display)}?`, + initial: true, + }); + + if (write) { + writeOpenCodeConfig(configPath, openCodeEntry); + console.log(chalk.green(`\nโœ“ Written to ${display}`)); + } else { + const json = JSON.stringify( + { + $schema: "https://opencode.ai/config.json", + mcp: { "agent-auth": openCodeEntry }, + }, + null, + 2, + ); + console.log(chalk.bold.white("\nAdd to your opencode.json:\n")); + console.log( + json + .split("\n") + .map((line) => chalk.cyan(` ${line}`)) + .join("\n"), + ); + console.log(); + } +} + +function writeOpenCodeConfig( + configPath: string, + entry: { type: string; command: string; args: string[]; enabled: boolean }, +) { + let config: { mcp?: Record; [key: string]: unknown } = {}; + if (fs.existsSync(configPath)) { + try { + config = JSON.parse(fs.readFileSync(configPath, "utf-8")); + } catch { + /* start fresh */ + } + } + const mcp = (config.mcp as Record | undefined) ?? {}; + mcp["agent-auth"] = entry; + config.$schema = "https://opencode.ai/config.json"; + config.mcp = mcp; + + fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n"); +} + +async function writeMcpConfigInteractive( + tool: string, + scope: "project" | "global", + args: string[], +) { + const entry: McpEntry = { command: "npx", args }; + const configPath = getMcpConfigPath(tool, scope); + + if (!configPath) { + showJsonConfig(entry); + return; + } + + const display = displayPath(configPath, scope); + const { write } = await prompts({ + type: "confirm", + name: "write", + message: `Write config to ${chalk.cyan(display)}?`, + initial: true, + }); + + if (write) { + writeMcpConfig(configPath, entry); + console.log(chalk.green(`\nโœ“ Written to ${display}`)); + } else { + showJsonConfig(entry); + } +} + +// โ”€โ”€ CLI Setup โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +async function setupCli() { + const { installCli } = await prompts({ + type: "confirm", + name: "installCli", + message: `Install ${chalk.cyan(AGENT_CLI_PKG)} globally?`, + initial: true, + }); + + if (installCli) { + const s = yoctoSpinner({ + text: `Installing ${AGENT_CLI_PKG}โ€ฆ`, + color: "white", + }); + s.start(); + try { + execSync(`npm install -g ${AGENT_CLI_PKG}`, { stdio: "pipe" }); + s.success(`${AGENT_CLI_PKG} installed globally.`); + } catch { + s.stop(); + console.log( + chalk.yellow("โš  Could not install automatically. Run manually:"), + ); + console.log(chalk.cyan(` npm install -g ${AGENT_CLI_PKG}\n`)); + } + } else { + console.log( + chalk.dim(`\n To install later: npm install -g ${AGENT_CLI_PKG}\n`), + ); + } + + await offerSkillInstall("agent-auth-cli"); + + console.log(chalk.bold.white("\nUsage:")); + console.log(chalk.gray(" # Discover a provider")); + console.log(chalk.cyan(" auth-agent discover https://api.example.com")); + console.log(chalk.gray("\n # Search the registry for providers")); + console.log(chalk.cyan(` auth-agent search "send email"`)); + console.log(chalk.gray("\n # Connect an agent with capabilities")); + console.log( + chalk.cyan( + " auth-agent connect --provider --capabilities ", + ), + ); + console.log(chalk.gray("\n # Execute a capability")); + console.log( + chalk.cyan( + ` auth-agent execute --args '{"key":"value"}'`, + ), + ); + console.log(chalk.gray("\n # Run as MCP server")); + console.log(chalk.cyan(` auth-agent mcp`)); + + showNextSteps([ + `${chalk.cyan("Docs")} ${PROTOCOL_URL}/docs/integrate-client`, + `${chalk.cyan("GitHub")} https://github.com/better-auth/agent-auth`, + ]); + + console.log( + chalk.green("\nโœ” ") + + chalk.bold("Ready. ") + + "Run auth-agent --help to see all commands.\n", + ); +} + +// โ”€โ”€ Server Setup โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +async function setupServer() { + const { source } = await prompts({ + type: "select", + name: "source", + message: "How do you want to define capabilities?", + choices: [ + { + title: "Default", + value: "manual", + description: "define capabilities in code", + }, + { + title: "From an OpenAPI spec", + value: "openapi", + description: "derive capabilities from an OpenAPI document", + }, + { + title: "From an MCP server", + value: "mcp", + description: "proxy an existing MCP server's tools", + }, + ], + }); + check(source); + + const { name } = await prompts({ + type: "text", + name: "name", + message: "What's your service called?", + validate: (v: string) => (v?.trim() ? true : "Name is required."), + }); + check(name); + + const { description } = await prompts({ + type: "text", + name: "description", + message: `Short description ${chalk.dim("(press Enter to skip)")}`, + }); + + const desc = description?.trim() || undefined; + + let sourceUrl: string | undefined; + if (source === "openapi") { + const { url } = await prompts({ + type: "text", + name: "url", + message: `OpenAPI spec URL ${chalk.dim("(e.g. https://api.example.com/openapi.json)")}`, + validate: (v: string) => (v?.trim() ? true : "URL is required."), + }); + check(url); + sourceUrl = url.trim(); + } else if (source === "mcp") { + const { url } = await prompts({ + type: "text", + name: "url", + message: `MCP server URL ${chalk.dim("(e.g. https://api.example.com/mcp)")}`, + validate: (v: string) => (v?.trim() ? true : "URL is required."), + }); + check(url); + sourceUrl = url.trim(); + } + + const code = generateServerCode(name.trim(), desc, source, sourceUrl); + + const { write } = await prompts({ + type: "confirm", + name: "write", + message: "Generate an auth config file?", + initial: true, + }); + + if (write) { + const { filePath } = await prompts({ + type: "text", + name: "filePath", + message: "File path", + initial: "lib/auth.ts", + }); + + const target = filePath?.trim() || "lib/auth.ts"; + + if (fs.existsSync(target)) { + const { overwrite } = await prompts({ + type: "confirm", + name: "overwrite", + message: `${chalk.yellow(target)} already exists. Overwrite?`, + initial: false, + }); + + if (!overwrite) { + showCodeBlock(code, "auth config"); + showServerOutro(); + return; + } + } + + const dir = path.dirname(target); + if (dir && dir !== "." && !fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.writeFileSync(target, code); + console.log(chalk.green(`\nโœ“ Created ${target}`)); + } else { + showCodeBlock(code, "auth config"); + } + + showServerOutro(); +} + +function generateServerCode( + name: string, + description: string | undefined, + source: string, + sourceUrl: string | undefined, +): string { + const descLine = description + ? `\n\t\t\tproviderDescription: ${JSON.stringify(description)},` + : ""; + + if (source === "openapi" && sourceUrl) { + return `import { betterAuth } from "better-auth"; +import { agentAuth } from "${AGENT_PLUGIN_PKG}"; +import { createFromOpenAPI } from "${AGENT_PLUGIN_PKG}/openapi"; + +const spec = await fetch(${JSON.stringify(sourceUrl)}).then(r => r.json()); + +const openapi = createFromOpenAPI(spec, { +\tbaseUrl: ${JSON.stringify(sourceUrl.replace(/\/openapi\.json$|\/openapi\.yaml$|\/swagger\.json$|\/docs\/openapi$/, ""))}, +}); + +export const auth = betterAuth({ +\tplugins: [ +\t\tagentAuth({ +\t\t\tproviderName: ${JSON.stringify(name)},${descLine} +\t\t\t...openapi, +\t\t}), +\t], +}); +`; + } + + if (source === "mcp" && sourceUrl) { + return `import { betterAuth } from "better-auth"; +import { agentAuth } from "${AGENT_PLUGIN_PKG}"; + +export const auth = betterAuth({ +\tplugins: [ +\t\tagentAuth({ +\t\t\tproviderName: ${JSON.stringify(name)},${descLine} +\t\t\tmcpServer: ${JSON.stringify(sourceUrl)}, +\t\t}), +\t], +}); +`; + } + + return `import { betterAuth } from "better-auth"; +import { agentAuth } from "${AGENT_PLUGIN_PKG}"; + +export const auth = betterAuth({ +\tplugins: [ +\t\tagentAuth({ +\t\t\tproviderName: ${JSON.stringify(name)},${descLine} +\t\t\tcapabilities: [ +\t\t\t\t{ +\t\t\t\t\tname: "example", +\t\t\t\t\tdescription: "An example capability โ€” replace with your own", +\t\t\t\t\tinput: { +\t\t\t\t\t\ttype: "object", +\t\t\t\t\t\tproperties: { +\t\t\t\t\t\t\tmessage: { type: "string", description: "Input message" }, +\t\t\t\t\t\t}, +\t\t\t\t\t}, +\t\t\t\t}, +\t\t\t], +\t\t\tasync onExecute({ capability, arguments: args }) { +\t\t\t\tswitch (capability) { +\t\t\t\t\tcase "example": +\t\t\t\t\t\treturn { message: \`Hello from \${(args as Record).message}\` }; +\t\t\t\t\tdefault: +\t\t\t\t\t\tthrow new Error(\`Unknown capability: \${capability}\`); +\t\t\t\t} +\t\t\t}, +\t\t}), +\t], +}); +`; +} + +function showServerOutro() { + console.log(chalk.bold.white("\nNext steps:\n")); + console.log(chalk.white(" 1. Install dependencies:")); + console.log(chalk.cyan(` npm install better-auth ${AGENT_PLUGIN_PKG}\n`)); + console.log(chalk.white(" 2. Configure your database:")); + console.log( + chalk.gray( + " Better Auth needs a database to store agents, hosts, and grants.", + ), + ); + console.log( + chalk.cyan(" https://www.better-auth.com/docs/concepts/database\n"), + ); + console.log(chalk.white(" 3. Run database migrations:")); + console.log(chalk.cyan(" npx auth migrate\n")); + console.log( + chalk.white(" 4. Expose the discovery endpoint at your app root:"), + ); + console.log(chalk.gray(" GET /.well-known/agent-configuration")); + console.log( + chalk.gray(" โ†’ return auth.api.getAgentConfiguration({ headers })\n"), + ); + console.log(` ${chalk.cyan("Docs")} ${PROTOCOL_URL}/docs/build-server`); + console.log( + ` ${chalk.cyan("GitHub")} https://github.com/better-auth/agent-auth`, + ); + + console.log( + chalk.green("\nโœ” ") + + chalk.bold("Server scaffolded. ") + + "Follow the steps above to finish setup.\n", + ); +} + +// โ”€โ”€ Helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +async function offerSkillInstall(skillName: string) { + const { installSkill } = await prompts({ + type: "confirm", + name: "installSkill", + message: `Install the ${chalk.cyan(skillName)} skill for your coding agents?`, + initial: true, + }); + + if (!installSkill) return; + + const cmd = `npx -y skills add ${SKILLS_REPO} --skill ${skillName}`; + const s = yoctoSpinner({ + text: `Installing ${skillName} skillโ€ฆ`, + color: "white", + }); + s.start(); + try { + execSync(cmd, { stdio: "pipe" }); + s.success(`${skillName} skill installed.`); + } catch { + s.stop(); + console.log( + chalk.yellow("โš  Could not install automatically. Run manually:"), + ); + console.log(chalk.cyan(` ${cmd}\n`)); + } +} + +function buildMcpArgs(registry: string): string[] { + const args = ["-y", AGENT_CLI_PKG, "mcp"]; + if (registry && registry !== DEFAULT_REGISTRY) { + args.push("--registry-url", registry); + } + return args; +} + +function getMcpConfigPath( + tool: string, + scope: "project" | "global", +): string | null { + const home = os.homedir(); + switch (tool) { + case "cursor": + return scope === "global" + ? path.join(home, ".cursor", "mcp.json") + : path.join(process.cwd(), ".cursor", "mcp.json"); + case "claude-desktop": + if (process.platform === "win32") + return path.join( + process.env.APPDATA || home, + "Claude", + "claude_desktop_config.json", + ); + if (process.platform === "darwin") + return path.join( + home, + "Library", + "Application Support", + "Claude", + "claude_desktop_config.json", + ); + return path.join(home, ".config", "Claude", "claude_desktop_config.json"); + case "windsurf": + return path.join(home, ".codeium", "windsurf", "mcp_config.json"); + case "vscode": + return scope === "global" + ? null + : path.join(process.cwd(), ".vscode", "mcp.json"); + default: + return null; + } +} + +function writeMcpConfig(configPath: string, entry: McpEntry) { + let config: Record = {}; + if (fs.existsSync(configPath)) { + try { + config = JSON.parse(fs.readFileSync(configPath, "utf-8")); + } catch { + /* start fresh */ + } + } + const servers = + (config.mcpServers as Record | undefined) ?? {}; + servers["agent-auth"] = entry; + config.mcpServers = servers; + + const dir = path.dirname(configPath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n"); +} + +function displayPath(filePath: string, scope: "project" | "global"): string { + if (scope === "project") { + return path.relative(process.cwd(), filePath) || filePath; + } + return filePath.replace(os.homedir(), "~"); +} + +function showJsonConfig(entry: McpEntry) { + const json = JSON.stringify({ mcpServers: { "agent-auth": entry } }, null, 2); + console.log(chalk.bold.white("\nAdd to your MCP configuration:\n")); + console.log( + json + .split("\n") + .map((line) => chalk.cyan(` ${line}`)) + .join("\n"), + ); + console.log(); +} + +function showCodeBlock(code: string, title: string) { + console.log(chalk.bold.white(`\n${title}:\n`)); + console.log( + code + .split("\n") + .map((line) => chalk.dim(` ${line}`)) + .join("\n"), + ); +} + +function showNextSteps(lines: string[]) { + console.log(chalk.bold.white("\nLearn more:\n")); + for (const line of lines) { + console.log(` ${line}`); + } +} + +// โ”€โ”€ Export โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +export const ai = new Command("ai") + .description("Interactive setup for Agent Auth โ€” AI agent authentication") + .action(aiAction); diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index a97874a515c..e19a08440ac 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,6 +1,7 @@ #!/usr/bin/env node import { Command } from "commander"; +import { ai } from "./commands/ai"; import { generate } from "./commands/generate"; import { info } from "./commands/info"; import { init } from "./commands/init"; @@ -30,6 +31,7 @@ async function main() { // it doesn't matter if we can't read the package.json file, we'll just use an empty object } program + .addCommand(ai) .addCommand(init) .addCommand(migrate) .addCommand(generate) From a62cb044f49adadd92a5793d7fa9ed38f85b084f Mon Sep 17 00:00:00 2001 From: Raihan <119592455+raihanbrillmark@users.noreply.github.com> Date: Fri, 20 Mar 2026 00:51:01 +0600 Subject: [PATCH 76/88] fix(organization): filter null organizations in listUserInvitations (#8694) Co-authored-by: Raihan Sharif --- packages/better-auth/src/plugins/organization/adapter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/better-auth/src/plugins/organization/adapter.ts b/packages/better-auth/src/plugins/organization/adapter.ts index bd676c5dd60..8cd65bf4b91 100644 --- a/packages/better-auth/src/plugins/organization/adapter.ts +++ b/packages/better-auth/src/plugins/organization/adapter.ts @@ -930,9 +930,9 @@ export const getOrgAdapter = ( organization: true, }, }); - return invitations.map(({ organization, ...inv }) => ({ + return invitations.filter(Boolean).map(({ organization, ...inv }) => ({ ...inv, - organizationName: organization.name, + organizationName: organization?.name, })); }, createInvitation: async ({ From 4f41b62cfb73f47e76fab15ff6052795bc30fa2b Mon Sep 17 00:00:00 2001 From: Gideon Ofori Addo Date: Mon, 16 Mar 2026 20:01:00 +0000 Subject: [PATCH 77/88] feat(two-factor): add `twoFactorPage` in config (#5329) --- docs/content/docs/plugins/2fa.mdx | 18 ++++++++++++++++++ .../src/plugins/two-factor/client.ts | 13 +++++++++++++ 2 files changed, 31 insertions(+) diff --git a/docs/content/docs/plugins/2fa.mdx b/docs/content/docs/plugins/2fa.mdx index 5f66b4a7c23..207b57e4265 100644 --- a/docs/content/docs/plugins/2fa.mdx +++ b/docs/content/docs/plugins/2fa.mdx @@ -151,6 +151,24 @@ const authClient = createAuthClient({ }); ``` +Using the `twoFactorPage` config: + +```ts title="sign-in.ts" +import { createAuthClient } from "better-auth/client"; +import { twoFactorClient } from "better-auth/client/plugins"; + +const authClient = createAuthClient({ + plugins: [ + twoFactorClient({ + twoFactorPage: "/two-factor", // the page to redirect if a user needs to verify their 2nd factor + }), + ], +}); +``` + + +Using the `twoFactorPage` option will cause a full page reload when redirecting users to the two-factor authentication page. If you want to avoid page reloads, consider using the `onTwoFactorRedirect` callback instead to handle the redirect programmatically within your application. + diff --git a/packages/better-auth/src/plugins/two-factor/client.ts b/packages/better-auth/src/plugins/two-factor/client.ts index 7f27b3cc244..2e117af7fae 100644 --- a/packages/better-auth/src/plugins/two-factor/client.ts +++ b/packages/better-auth/src/plugins/two-factor/client.ts @@ -7,6 +7,13 @@ export * from "./error-code"; export const twoFactorClient = ( options?: | { + /** + * the page to redirect if a user needs to verify + * their two factor + * + * @warning This causes a full page reload when used. + */ + twoFactorPage?: string; /** * a redirect function to call if a user needs to verify * their two factor @@ -43,6 +50,12 @@ export const twoFactorClient = ( if (context.data?.twoFactorRedirect) { if (options?.onTwoFactorRedirect) { await options.onTwoFactorRedirect(); + return; + } + + // fallback for when `onTwoFactorRedirect` is not used and only `twoFactorPage` is provided + if (options?.twoFactorPage && typeof window !== "undefined") { + window.location.href = options.twoFactorPage; } } }, From 98c8e4e65c0e33f8a8ec2dba60ee5c78284059dd Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:13:12 +0900 Subject: [PATCH 78/88] feat(email-otp): add `resendStrategy` option to reuse existing OTP (#8560) --- .cspell/auth-terms.txt | 1 + docs/content/docs/plugins/email-otp.mdx | 20 ++ .../src/plugins/email-otp/email-otp.test.ts | 224 ++++++++++++++++++ .../src/plugins/email-otp/index.ts | 3 +- .../src/plugins/email-otp/otp-token.ts | 57 ++++- .../src/plugins/email-otp/routes.ts | 174 +++++++------- .../src/plugins/email-otp/types.ts | 19 ++ .../src/plugins/email-otp/utils.ts | 8 + 8 files changed, 411 insertions(+), 95 deletions(-) diff --git a/.cspell/auth-terms.txt b/.cspell/auth-terms.txt index 2dbe8bbc5cf..b090e3954f4 100644 --- a/.cspell/auth-terms.txt +++ b/.cspell/auth-terms.txt @@ -1,4 +1,5 @@ totp +otps pkce unban siwe diff --git a/docs/content/docs/plugins/email-otp.mdx b/docs/content/docs/plugins/email-otp.mdx index aa84cd5c747..ac9b11b7140 100644 --- a/docs/content/docs/plugins/email-otp.mdx +++ b/docs/content/docs/plugins/email-otp.mdx @@ -411,6 +411,26 @@ export const auth = betterAuth({ When the maximum attempts are exceeded, the `verifyOTP`, `signIn.emailOtp`, `verifyEmail`, and `resetPassword` methods will return an error with code `TOO_MANY_ATTEMPTS`. +- `resendStrategy`: Controls what happens when a user requests a new OTP while an existing one is still valid. Defaults to `"rotate"`. + - `"rotate"`: Always generates a new OTP (default behavior). + - `"reuse"`: Resends the same OTP and extends its expiry. This prevents multiple valid codes from existing simultaneously when emails are delayed. Only works when the OTP is recoverable (`plain`, `encrypted`, or custom encrypt/decrypt). Falls back to `"rotate"` when the OTP is hashed. If the allowed attempts have been exhausted, a fresh OTP is generated instead of reusing the exhausted one. + +```ts title="auth.ts" +import { betterAuth } from "better-auth" +import { emailOTP } from "better-auth/plugins" + +export const auth = betterAuth({ + plugins: [ + emailOTP({ + resendStrategy: "reuse", // [!code highlight] + async sendVerificationOTP({ email, otp, type }) { + // send the OTP + }, + }) + ] +}) +``` + - `storeOTP`: The method used to transform the OTP before it is stored by Better Auth's verification layer, whether `encrypted`, `hashed` or `plain` text. Default is `plain` text. diff --git a/packages/better-auth/src/plugins/email-otp/email-otp.test.ts b/packages/better-auth/src/plugins/email-otp/email-otp.test.ts index 658e67f5747..77876ed670b 100644 --- a/packages/better-auth/src/plugins/email-otp/email-otp.test.ts +++ b/packages/better-auth/src/plugins/email-otp/email-otp.test.ts @@ -1978,3 +1978,227 @@ describe("race condition protection", async () => { expect(res2.error?.code).toBe("INVALID_OTP"); }); }); + +describe("email-otp-resendStrategy", async () => { + afterEach(() => { + vi.useRealTimers(); + }); + + const otps: string[] = []; + const { client, testUser } = await getTestInstance( + { + plugins: [ + emailOTP({ + async sendVerificationOTP({ otp }) { + otps.push(otp); + }, + resendStrategy: "reuse", + }), + ], + }, + { + clientOptions: { + plugins: [emailOTPClient()], + }, + }, + ); + + it("should reuse existing OTP when resendStrategy is reuse", async () => { + otps.length = 0; + await client.emailOtp.sendVerificationOtp({ + email: testUser.email, + type: "email-verification", + }); + const firstOtp = otps[0]; + expect(firstOtp).toBeDefined(); + + await client.emailOtp.sendVerificationOtp({ + email: testUser.email, + type: "email-verification", + }); + const secondOtp = otps[1]; + expect(secondOtp).toBeDefined(); + expect(secondOtp).toBe(firstOtp); + }); + + it("should generate new OTP after previous one expires", async () => { + otps.length = 0; + vi.useFakeTimers(); + + await client.emailOtp.sendVerificationOtp({ + email: testUser.email, + type: "sign-in", + }); + const firstOtp = otps[0]; + expect(firstOtp).toBeDefined(); + + // Advance past expiry (default 5 minutes) + await vi.advanceTimersByTimeAsync(6 * 60 * 1000); + + await client.emailOtp.sendVerificationOtp({ + email: testUser.email, + type: "sign-in", + }); + const secondOtp = otps[1]; + expect(secondOtp).toBeDefined(); + expect(secondOtp).not.toBe(firstOtp); + }); + + it("should generate new OTP when resendStrategy is reuse but storeOTP is hashed", async () => { + const hashedOtps: string[] = []; + const { client: hashedClient, testUser: hashedUser } = + await getTestInstance( + { + plugins: [ + emailOTP({ + async sendVerificationOTP({ otp }) { + hashedOtps.push(otp); + }, + resendStrategy: "reuse", + storeOTP: "hashed", + }), + ], + }, + { + clientOptions: { + plugins: [emailOTPClient()], + }, + }, + ); + + await hashedClient.emailOtp.sendVerificationOtp({ + email: hashedUser.email, + type: "email-verification", + }); + const firstOtp = hashedOtps[0]; + expect(firstOtp).toBeDefined(); + + // Second request - should get NEW OTP since hashed OTP cannot be retrieved + await hashedClient.emailOtp.sendVerificationOtp({ + email: hashedUser.email, + type: "email-verification", + }); + const secondOtp = hashedOtps[1]; + expect(secondOtp).toBeDefined(); + expect(secondOtp).not.toBe(firstOtp); + }); + + it("should generate new OTP when resendStrategy is reuse but storeOTP is custom hash", async () => { + const customHashOtps: string[] = []; + const { client: hashClient, testUser: hashUser } = await getTestInstance( + { + plugins: [ + emailOTP({ + async sendVerificationOTP({ otp }) { + customHashOtps.push(otp); + }, + resendStrategy: "reuse", + storeOTP: { + hash: async (otp) => `hashed-${otp}`, + }, + }), + ], + }, + { + clientOptions: { + plugins: [emailOTPClient()], + }, + }, + ); + + await hashClient.emailOtp.sendVerificationOtp({ + email: hashUser.email, + type: "email-verification", + }); + const firstOtp = customHashOtps[0]; + expect(firstOtp).toBeDefined(); + + await hashClient.emailOtp.sendVerificationOtp({ + email: hashUser.email, + type: "email-verification", + }); + const secondOtp = customHashOtps[1]; + expect(secondOtp).toBeDefined(); + expect(secondOtp).not.toBe(firstOtp); + }); + + it("should not send OTP for non-existent user on email-verification type", async () => { + otps.length = 0; + const { client: noSignUpClient } = await getTestInstance( + { + plugins: [ + emailOTP({ + async sendVerificationOTP({ otp }) { + otps.push(otp); + }, + resendStrategy: "reuse", + disableSignUp: true, + }), + ], + }, + { + clientOptions: { + plugins: [emailOTPClient()], + }, + }, + ); + + const res = await noSignUpClient.emailOtp.sendVerificationOtp({ + email: "nonexistent@test.com", + type: "email-verification", + }); + expect(res.data?.success).toBe(true); + // OTP should not be sent since user doesn't exist + expect(otps.length).toBe(0); + }); + + it("should generate fresh OTP when attempts are exhausted", async () => { + otps.length = 0; + const { client: attemptClient, testUser: attemptUser } = + await getTestInstance( + { + plugins: [ + emailOTP({ + async sendVerificationOTP({ otp }) { + otps.push(otp); + }, + resendStrategy: "reuse", + allowedAttempts: 2, + }), + ], + }, + { + clientOptions: { + plugins: [emailOTPClient()], + }, + }, + ); + + // Send first OTP + await attemptClient.emailOtp.sendVerificationOtp({ + email: attemptUser.email, + type: "email-verification", + }); + const firstOtp = otps[0]; + expect(firstOtp).toBeDefined(); + + // Exhaust attempts by verifying with wrong OTP + await attemptClient.emailOtp.verifyEmail({ + email: attemptUser.email, + otp: "wrong1", + }); + await attemptClient.emailOtp.verifyEmail({ + email: attemptUser.email, + otp: "wrong2", + }); + + // Request new OTP โ€” should generate fresh one since attempts exhausted + await attemptClient.emailOtp.sendVerificationOtp({ + email: attemptUser.email, + type: "email-verification", + }); + const secondOtp = otps[1]; + expect(secondOtp).toBeDefined(); + expect(secondOtp).not.toBe(firstOtp); + }); +}); diff --git a/packages/better-auth/src/plugins/email-otp/index.ts b/packages/better-auth/src/plugins/email-otp/index.ts index 028666cef1b..0a29bf06917 100644 --- a/packages/better-auth/src/plugins/email-otp/index.ts +++ b/packages/better-auth/src/plugins/email-otp/index.ts @@ -19,6 +19,7 @@ import { verifyEmailOTP, } from "./routes"; import type { EmailOTPOptions } from "./types"; +import { toOTPIdentifier } from "./utils"; declare module "@better-auth/core" { interface BetterAuthPluginRegistry { @@ -105,7 +106,7 @@ export const emailOTP = (options: EmailOTPOptions) => { const storedOTP = await storeOTP(ctx, opts, otp); await ctx.context.internalAdapter.createVerificationValue({ value: `${storedOTP}:0`, - identifier: `email-verification-otp-${email}`, + identifier: toOTPIdentifier("email-verification", email), expiresAt: getDate(opts.expiresIn, "sec"), }); await ctx.context.runInBackgroundOrAwait( diff --git a/packages/better-auth/src/plugins/email-otp/otp-token.ts b/packages/better-auth/src/plugins/email-otp/otp-token.ts index b7e496e09e2..5f1a4192a44 100644 --- a/packages/better-auth/src/plugins/email-otp/otp-token.ts +++ b/packages/better-auth/src/plugins/email-otp/otp-token.ts @@ -4,8 +4,9 @@ import { symmetricDecrypt, symmetricEncrypt, } from "../../crypto"; -import type { EmailOTPOptions } from "./types"; -import { defaultKeyHasher } from "./utils"; +import { getDate } from "../../utils/date"; +import type { EmailOTPOptions, RequiredEmailOTPOptions } from "./types"; +import { defaultKeyHasher, splitAtLastColon } from "./utils"; export async function storeOTP( ctx: GenericEndpointContext, @@ -59,3 +60,55 @@ export async function verifyStoredOTP( return constantTimeEqual(otp, storedOtp); } + +/** + * Retrieves the plain-text OTP from a stored value. + * Returns `null` if the OTP is hashed and cannot be recovered. + */ +async function retrieveOTP( + ctx: GenericEndpointContext, + opts: EmailOTPOptions, + storedOtp: string, +): Promise { + if (opts.storeOTP === "plain" || opts.storeOTP === undefined) { + return storedOtp; + } + if (opts.storeOTP === "encrypted") { + return await symmetricDecrypt({ + key: ctx.context.secretConfig, + data: storedOtp, + }); + } + if (typeof opts.storeOTP === "object" && "decrypt" in opts.storeOTP) { + return await opts.storeOTP.decrypt(storedOtp); + } + // hashed or custom hash -> cannot recover + return null; +} + +/** + * Tries to reuse an existing unexpired OTP. + * Returns the plain-text OTP if reusable, `null` otherwise. + */ +export async function tryReuseOTP( + ctx: GenericEndpointContext, + opts: RequiredEmailOTPOptions, + identifier: string, +): Promise { + const existing = + await ctx.context.internalAdapter.findVerificationValue(identifier); + if (!existing || existing.expiresAt < new Date()) return null; + + const [storedOtpValue, attempts] = splitAtLastColon(existing.value); + const allowedAttempts = opts.allowedAttempts || 3; + if (attempts && parseInt(attempts) >= allowedAttempts) return null; + + const plainOtp = await retrieveOTP(ctx, opts, storedOtpValue); + if (!plainOtp) return null; + + await ctx.context.internalAdapter.updateVerificationByIdentifier(identifier, { + expiresAt: getDate(opts.expiresIn, "sec"), + }); + + return plainOtp; +} diff --git a/packages/better-auth/src/plugins/email-otp/routes.ts b/packages/better-auth/src/plugins/email-otp/routes.ts index 1d6a72992a9..1a870ea6778 100644 --- a/packages/better-auth/src/plugins/email-otp/routes.ts +++ b/packages/better-auth/src/plugins/email-otp/routes.ts @@ -12,9 +12,10 @@ import { setCookieCache, setSessionCookie } from "../../cookies"; import { generateRandomString, symmetricDecrypt } from "../../crypto"; import { parseUserInput, parseUserOutput } from "../../db/schema"; import { getDate } from "../../utils/date"; -import { storeOTP, verifyStoredOTP } from "./otp-token"; -import type { EmailOTPOptions } from "./types"; -import { splitAtLastColon } from "./utils"; +import { EMAIL_OTP_ERROR_CODES as ERROR_CODES } from "./error-codes"; +import { storeOTP, tryReuseOTP, verifyStoredOTP } from "./otp-token"; +import type { EmailOTPOptions, RequiredEmailOTPOptions } from "./types"; +import { splitAtLastColon, toOTPIdentifier } from "./utils"; const types = [ "email-verification", @@ -23,14 +24,48 @@ const types = [ "change-email", ] as const; -type WithRequired = T & { [P in K]-?: T[P] }; +/** + * Resolves the OTP to send: reuses an existing one if possible, + * otherwise generates and stores a new one. + * + * @internal + */ +async function resolveOTP( + ctx: GenericEndpointContext, + opts: RequiredEmailOTPOptions, + email: string, + type: (typeof types)[number], +): Promise { + const identifier = toOTPIdentifier(type, email); + + if (opts.resendStrategy === "reuse") { + const reused = await tryReuseOTP(ctx, opts, identifier); + if (reused) return reused; + } -type RequiredEmailOTPOptions = WithRequired< - EmailOTPOptions, - "expiresIn" | "generateOTP" | "storeOTP" ->; + const otp = + opts.generateOTP({ email, type }, ctx) || defaultOTPGenerator(opts); + const storedOTP = await storeOTP(ctx, opts, otp); -import { EMAIL_OTP_ERROR_CODES as ERROR_CODES } from "./error-codes"; + await ctx.context.internalAdapter + .createVerificationValue({ + value: `${storedOTP}:0`, + identifier, + expiresAt: getDate(opts.expiresIn, "sec"), + }) + .catch(async () => { + await ctx.context.internalAdapter.deleteVerificationByIdentifier( + identifier, + ); + await ctx.context.internalAdapter.createVerificationValue({ + value: `${storedOTP}:0`, + identifier, + expiresAt: getDate(opts.expiresIn, "sec"), + }); + }); + + return otp; +} const sendVerificationOTPBodySchema = z.object({ email: z.string({}).meta({ @@ -108,57 +143,22 @@ export const sendVerificationOTP = (opts: RequiredEmailOTPOptions) => message: "Invalid OTP type", }); } - const otp = - opts.generateOTP({ email, type: ctx.body.type }, ctx) || - defaultOTPGenerator(opts); - - const storedOTP = await storeOTP(ctx, opts, otp); + const identifier = toOTPIdentifier(ctx.body.type, email); + const otp = await resolveOTP(ctx, opts, email, ctx.body.type); - await ctx.context.internalAdapter - .createVerificationValue({ - value: `${storedOTP}:0`, - identifier: `${ctx.body.type}-otp-${email}`, - expiresAt: getDate(opts.expiresIn, "sec"), - }) - .catch(async (error) => { - // might be duplicate key error - await ctx.context.internalAdapter.deleteVerificationByIdentifier( - `${ctx.body.type}-otp-${email}`, - ); - //try again - await ctx.context.internalAdapter.createVerificationValue({ - value: `${storedOTP}:0`, - identifier: `${ctx.body.type}-otp-${email}`, - expiresAt: getDate(opts.expiresIn, "sec"), - }); - }); + const shouldSendOTP = ctx.body.type === "sign-in" && !opts.disableSignUp; const user = await ctx.context.internalAdapter.findUserByEmail(email); - if (!user) { - if (ctx.body.type === "sign-in" && !opts.disableSignUp) { - // allow - } else { - await ctx.context.internalAdapter.deleteVerificationByIdentifier( - `${ctx.body.type}-otp-${email}`, - ); - return ctx.json({ - success: true, - }); - } + if (!user && !shouldSendOTP) { + await ctx.context.internalAdapter.deleteVerificationByIdentifier( + identifier, + ); + return ctx.json({ success: true }); } await ctx.context.runInBackgroundOrAwait( - opts.sendVerificationOTP( - { - email, - otp, - type: ctx.body.type, - }, - ctx, - ), + opts.sendVerificationOTP({ email, otp, type: ctx.body.type }, ctx), ); - return ctx.json({ - success: true, - }); + return ctx.json({ success: true }); }, ); @@ -204,7 +204,7 @@ export const createVerificationOTP = (opts: RequiredEmailOTPOptions) => const storedOTP = await storeOTP(ctx, opts, otp); await ctx.context.internalAdapter.createVerificationValue({ value: `${storedOTP}:0`, - identifier: `${ctx.body.type}-otp-${email}`, + identifier: toOTPIdentifier(ctx.body.type, email), expiresAt: getDate(opts.expiresIn, "sec"), }); return otp; @@ -270,7 +270,7 @@ export const getVerificationOTP = (opts: RequiredEmailOTPOptions) => const email = ctx.query.email.toLowerCase(); const verificationValue = await ctx.context.internalAdapter.findVerificationValue( - `${ctx.query.type}-otp-${email}`, + toOTPIdentifier(ctx.query.type, email), ); if (!verificationValue || verificationValue.expiresAt < new Date()) { return ctx.json({ @@ -371,17 +371,15 @@ export const checkVerificationOTP = (opts: RequiredEmailOTPOptions) => if (!user) { throw APIError.from("BAD_REQUEST", BASE_ERROR_CODES.USER_NOT_FOUND); } + const identifier = toOTPIdentifier(ctx.body.type, email); const verificationValue = - await ctx.context.internalAdapter.findVerificationValue( - `${ctx.body.type}-otp-${email}`, - ); + await ctx.context.internalAdapter.findVerificationValue(identifier); if (!verificationValue) { throw APIError.from("BAD_REQUEST", ERROR_CODES.INVALID_OTP); } - const otpIdentifier = `${ctx.body.type}-otp-${email}`; if (verificationValue.expiresAt < new Date()) { await ctx.context.internalAdapter.deleteVerificationByIdentifier( - otpIdentifier, + identifier, ); throw APIError.from("BAD_REQUEST", ERROR_CODES.OTP_EXPIRED); } @@ -390,14 +388,14 @@ export const checkVerificationOTP = (opts: RequiredEmailOTPOptions) => const allowedAttempts = opts?.allowedAttempts || 3; if (attempts && parseInt(attempts) >= allowedAttempts) { await ctx.context.internalAdapter.deleteVerificationByIdentifier( - otpIdentifier, + identifier, ); throw APIError.from("FORBIDDEN", ERROR_CODES.TOO_MANY_ATTEMPTS); } const verified = await verifyStoredOTP(ctx, opts, otpValue, ctx.body.otp); if (!verified) { await ctx.context.internalAdapter.updateVerificationByIdentifier( - otpIdentifier, + identifier, { value: `${otpValue}:${parseInt(attempts || "0") + 1}`, }, @@ -488,7 +486,7 @@ export const verifyEmailOTP = (opts: RequiredEmailOTPOptions) => await atomicVerifyOTP( ctx, opts, - `email-verification-otp-${email}`, + toOTPIdentifier("email-verification", email), ctx.body.otp, ); @@ -641,7 +639,7 @@ export const signInEmailOTP = (opts: RequiredEmailOTPOptions) => const email = rawEmail.toLowerCase(); // Use atomic verification to prevent race conditions - await atomicVerifyOTP(ctx, opts, `sign-in-otp-${email}`, otp); + await atomicVerifyOTP(ctx, opts, toOTPIdentifier("sign-in", email), otp); const user = await ctx.context.internalAdapter.findUserByEmail(email); if (!user) { @@ -748,19 +746,12 @@ export const requestPasswordResetEmailOTP = (opts: RequiredEmailOTPOptions) => }, async (ctx) => { const email = ctx.body.email; - const otp = - opts.generateOTP({ email, type: "forget-password" }, ctx) || - defaultOTPGenerator(opts); - const storedOTP = await storeOTP(ctx, opts, otp); - await ctx.context.internalAdapter.createVerificationValue({ - value: `${storedOTP}:0`, - identifier: `forget-password-otp-${email}`, - expiresAt: getDate(opts.expiresIn, "sec"), - }); + const identifier = toOTPIdentifier("forget-password", email); + const otp = await resolveOTP(ctx, opts, email, "forget-password"); const user = await ctx.context.internalAdapter.findUserByEmail(email); if (!user) { await ctx.context.internalAdapter.deleteVerificationByIdentifier( - `forget-password-otp-${email}`, + identifier, ); return ctx.json({ success: true, @@ -847,19 +838,12 @@ export const forgetPasswordEmailOTP = (opts: RequiredEmailOTPOptions) => { async (ctx) => { warnDeprecation(); const email = ctx.body.email; - const otp = - opts.generateOTP({ email, type: "forget-password" }, ctx) || - defaultOTPGenerator(opts); - const storedOTP = await storeOTP(ctx, opts, otp); - await ctx.context.internalAdapter.createVerificationValue({ - value: `${storedOTP}:0`, - identifier: `forget-password-otp-${email}`, - expiresAt: getDate(opts.expiresIn, "sec"), - }); + const identifier = toOTPIdentifier("forget-password", email); + const otp = await resolveOTP(ctx, opts, email, "forget-password"); const user = await ctx.context.internalAdapter.findUserByEmail(email); if (!user) { await ctx.context.internalAdapter.deleteVerificationByIdentifier( - `forget-password-otp-${email}`, + identifier, ); return ctx.json({ success: true, @@ -946,7 +930,7 @@ export const resetPasswordEmailOTP = (opts: RequiredEmailOTPOptions) => await atomicVerifyOTP( ctx, opts, - `forget-password-otp-${email}`, + toOTPIdentifier("forget-password", email), ctx.body.otp, ); @@ -1093,12 +1077,15 @@ export const requestEmailChangeEmailOTP = (opts: RequiredEmailOTPOptions) => const currentEmailVerificationValue = await ctx.context.internalAdapter.findVerificationValue( - `email-verification-otp-${email}`, + toOTPIdentifier("email-verification", email), ); if (!currentEmailVerificationValue) { throw APIError.from("BAD_REQUEST", ERROR_CODES.INVALID_OTP); } - const currentEmailIdentifier = `email-verification-otp-${email}`; + const currentEmailIdentifier = toOTPIdentifier( + "email-verification", + email, + ); if (currentEmailVerificationValue.expiresAt < new Date()) { await ctx.context.internalAdapter.deleteVerificationByIdentifier( currentEmailIdentifier, @@ -1151,14 +1138,14 @@ export const requestEmailChangeEmailOTP = (opts: RequiredEmailOTPOptions) => const storedOTP = await storeOTP(ctx, opts, otp); await ctx.context.internalAdapter.createVerificationValue({ value: `${storedOTP}:0`, - identifier: `change-email-otp-${email}-${newEmail}`, + identifier: toOTPIdentifier("change-email", `${email}-${newEmail}`), expiresAt: getDate(opts.expiresIn, "sec"), }); const user = await ctx.context.internalAdapter.findUserByEmail(newEmail); if (user) { await ctx.context.internalAdapter.deleteVerificationByIdentifier( - `change-email-otp-${email}-${newEmail}`, + toOTPIdentifier("change-email", `${email}-${newEmail}`), ); return ctx.json({ success: true, @@ -1262,12 +1249,15 @@ export const changeEmailEmailOTP = (opts: RequiredEmailOTPOptions) => const verificationValue = await ctx.context.internalAdapter.findVerificationValue( - `change-email-otp-${email}-${newEmail}`, + toOTPIdentifier("change-email", `${email}-${newEmail}`), ); if (!verificationValue) { throw APIError.from("BAD_REQUEST", ERROR_CODES.INVALID_OTP); } - const changeEmailIdentifier = `change-email-otp-${email}-${newEmail}`; + const changeEmailIdentifier = toOTPIdentifier( + "change-email", + `${email}-${newEmail}`, + ); if (verificationValue.expiresAt < new Date()) { await ctx.context.internalAdapter.deleteVerificationByIdentifier( changeEmailIdentifier, diff --git a/packages/better-auth/src/plugins/email-otp/types.ts b/packages/better-auth/src/plugins/email-otp/types.ts index 1591b8337f5..a3718c73fb4 100644 --- a/packages/better-auth/src/plugins/email-otp/types.ts +++ b/packages/better-auth/src/plugins/email-otp/types.ts @@ -1,5 +1,12 @@ import type { GenericEndpointContext } from "@better-auth/core"; +type WithRequired = T & { [P in K]-?: T[P] }; + +export type RequiredEmailOTPOptions = WithRequired< + EmailOTPOptions, + "expiresIn" | "generateOTP" | "storeOTP" +>; + export interface EmailOTPOptions { /** * Function to send email verification. @@ -81,6 +88,18 @@ export interface EmailOTPOptions { } ) | undefined; + /** + * Strategy for handling OTP when the user requests a new OTP + * while an existing one is still valid. + * + * - `"rotate"`: Always generates a new OTP (default behavior). + * - `"reuse"`: Resends the same OTP and extends its expiry. + * Only works when the OTP is recoverable (plain, encrypted, or custom encrypt/decrypt). + * Falls back to `"rotate"` when OTP is hashed. + * + * @default "rotate" + */ + resendStrategy?: "rotate" | "reuse" | undefined; /** * Change email configuration for the change email with OTP flow * diff --git a/packages/better-auth/src/plugins/email-otp/utils.ts b/packages/better-auth/src/plugins/email-otp/utils.ts index 42f794d26f2..a55f339ff7a 100644 --- a/packages/better-auth/src/plugins/email-otp/utils.ts +++ b/packages/better-auth/src/plugins/email-otp/utils.ts @@ -1,5 +1,13 @@ import { base64Url } from "@better-auth/utils/base64"; import { createHash } from "@better-auth/utils/hash"; + +export function toOTPIdentifier( + type: "email-verification" | "sign-in" | "forget-password" | "change-email", + email: string, +) { + return `${type}-otp-${email}`; +} + export const defaultKeyHasher = async (otp: string) => { const hash = await createHash("SHA-256").digest( new TextEncoder().encode(otp), From 74ec71cae1c0248950190b02cde218efa48201ef Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:55:22 +0900 Subject: [PATCH 79/88] fix(stripe): improve organization customer search by adding customerType check (#8609) --- packages/stripe/src/routes.ts | 6 +- .../stripe/test/stripe-organization.test.ts | 166 ++++++++++++++++++ 2 files changed, 170 insertions(+), 2 deletions(-) diff --git a/packages/stripe/src/routes.ts b/packages/stripe/src/routes.ts index 56f276a3636..9e9b103a14f 100644 --- a/packages/stripe/src/routes.ts +++ b/packages/stripe/src/routes.ts @@ -347,7 +347,7 @@ export const upgradeSubscription = (options: StripeOptions) => { let stripeCustomer: Stripe.Customer | undefined; try { const result = await client.customers.search({ - query: `metadata["${customerMetadata.keys.organizationId}"]:"${org.id}"`, + query: `metadata["${customerMetadata.keys.organizationId}"]:"${org.id}" AND metadata["${customerMetadata.keys.customerType}"]:"organization"`, limit: 1, }); stripeCustomer = result.data[0]; @@ -362,7 +362,9 @@ export const upgradeSubscription = (options: StripeOptions) => { if ( customer.metadata?.[ customerMetadata.keys.organizationId - ] === org.id + ] === org.id && + customer.metadata?.[customerMetadata.keys.customerType] === + "organization" ) { stripeCustomer = customer; break; diff --git a/packages/stripe/test/stripe-organization.test.ts b/packages/stripe/test/stripe-organization.test.ts index e1d7fe4b2e0..a7035eeb06f 100644 --- a/packages/stripe/test/stripe-organization.test.ts +++ b/packages/stripe/test/stripe-organization.test.ts @@ -1664,6 +1664,172 @@ describe("stripe - organization customer", () => { }), ); }); + + it("should not match user customer with organizationId in metadata during org customer lookup", async () => { + const userCustomerId = "cus_user_with_org_metadata"; + const orgCustomerId = "cus_org_new"; + + const mockStripeCustomerType = { + prices: { + list: vi.fn().mockResolvedValue({ data: [{ id: "price_lookup_123" }] }), + }, + customers: { + create: vi.fn().mockResolvedValue({ + id: orgCustomerId, + metadata: { customerType: "organization" }, + }), + list: vi.fn().mockResolvedValue({ data: [] }), + // First call (user upgrade): no existing customer + // Second call (org upgrade): returns user customer only if query + // lacks customerType filter โ€” verifies the fix actually matters + search: vi.fn().mockResolvedValueOnce({ data: [] }), + retrieve: vi.fn(), + update: vi.fn(), + }, + checkout: { + sessions: { + create: vi.fn().mockResolvedValue({ + url: "https://checkout.stripe.com/mock", + id: "cs_mock123", + }), + }, + }, + billingPortal: { + sessions: { + create: vi + .fn() + .mockResolvedValue({ url: "https://billing.stripe.com/mock" }), + }, + }, + subscriptions: { + retrieve: vi.fn(), + list: vi.fn().mockResolvedValue({ data: [] }), + update: vi.fn(), + }, + webhooks: { constructEventAsync: vi.fn() }, + }; + + const stripeOptionsCustomerType: StripeOptions = { + ...baseOrgStripeOptions, + stripeClient: mockStripeCustomerType as unknown as Stripe, + }; + + const { client, auth, sessionSetter } = await getTestInstance( + { + plugins: [organization(), stripe(stripeOptionsCustomerType)], + }, + { + disableTestUser: true, + clientOptions: { + plugins: [organizationClient(), stripeClient({ subscription: true })], + }, + }, + ); + const ctx = await auth.$context; + + // User A signs up + await client.signUp.email( + { ...testUser, email: "user-a@email.com" }, + { throw: true }, + ); + const userAHeaders = new Headers(); + await client.signIn.email( + { ...testUser, email: "user-a@email.com" }, + { throw: true, onSuccess: sessionSetter(userAHeaders) }, + ); + + // User B signs up and creates an organization + await client.signUp.email( + { ...testUser, email: "user-b@email.com" }, + { throw: true }, + ); + const userBHeaders = new Headers(); + await client.signIn.email( + { ...testUser, email: "user-b@email.com" }, + { throw: true, onSuccess: sessionSetter(userBHeaders) }, + ); + + const org = await client.organization.create({ + name: "Test Org", + slug: "customer-type-filter-org", + fetchOptions: { headers: userBHeaders }, + }); + const orgId = org.data?.id as string; + + // User A upgrades with metadata containing the org's ID + mockStripeCustomerType.customers.create.mockResolvedValueOnce({ + id: userCustomerId, + metadata: { + userId: "user-a", + customerType: "user", + organizationId: orgId, + }, + }); + + await client.subscription.upgrade({ + plan: "starter", + metadata: { organizationId: orgId }, + fetchOptions: { headers: userAHeaders }, + }); + + // Organization upgrades + mockStripeCustomerType.customers.search.mockImplementationOnce( + (params: { query?: string }) => { + const query = params?.query ?? ""; + if (query.includes(orgId) && !query.includes("customerType")) { + // Without the fix: user customer would be returned + return Promise.resolve({ + data: [ + { + id: userCustomerId, + metadata: { + userId: "user-a", + customerType: "user", + organizationId: orgId, + }, + }, + ], + }); + } + // With the fix: customerType filter excludes user customer + return Promise.resolve({ data: [] }); + }, + ); + + mockStripeCustomerType.customers.create.mockResolvedValueOnce({ + id: orgCustomerId, + metadata: { organizationId: orgId, customerType: "organization" }, + }); + + await client.subscription.upgrade({ + plan: "starter", + customerType: "organization", + referenceId: orgId, + fetchOptions: { headers: userBHeaders }, + }); + + // Organization should have its own customer, not User A's + const updatedOrg = await ctx.adapter.findOne<{ + id: string; + stripeCustomerId?: string; + }>({ + model: "organization", + where: [{ field: "id", value: orgId }], + }); + expect(updatedOrg?.stripeCustomerId).toBe(orgCustomerId); + + // Find the org lookup search call and verify the full query + const orgSearchCall = + mockStripeCustomerType.customers.search.mock.calls.find( + ([arg]) => + typeof arg?.query === "string" && + arg.query.includes(orgId) && + arg.query.includes("organizationId"), + ); + expect(orgSearchCall?.[0]?.query).toContain( + `metadata["organizationId"]:"${orgId}" AND metadata["customerType"]:"organization"`, + ); + }); }); describe("stripe - organizationHooks integration", () => { From adddb07f6a04447cb5697d9f359851123fcbfc59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 09:55:02 -0700 Subject: [PATCH 80/88] chore(deps): bump fast-xml-parser from 5.4.1 to 5.5.6 (#8665) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/sso/package.json | 2 +- pnpm-lock.yaml | 1178 ++++++++++++++++++++++++------------- 2 files changed, 783 insertions(+), 397 deletions(-) diff --git a/packages/sso/package.json b/packages/sso/package.json index b99bebc5b76..92a87e0ed15 100644 --- a/packages/sso/package.json +++ b/packages/sso/package.json @@ -66,7 +66,7 @@ "dependencies": { "@better-auth/utils": "catalog:", "@better-fetch/fetch": "catalog:", - "fast-xml-parser": "^5.4.1", + "fast-xml-parser": "^5.5.6", "jose": "^6.1.3", "samlify": "^2.10.2", "tldts": "^6.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 872d352e2b8..1afd349aeea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,11 +13,11 @@ catalogs: specifier: 1.1.21 version: 1.1.21 better-call: - specifier: 1.3.2 - version: 1.3.2 + specifier: 2.0.2 + version: 2.0.2 tsdown: - specifier: 0.21.0-beta.2 - version: 0.21.0-beta.2 + specifier: 0.21.1 + version: 0.21.1 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -112,7 +112,7 @@ importers: version: 5.9.3 vitest: specifier: catalog:vitest - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) docs: dependencies: @@ -223,7 +223,7 @@ importers: version: 8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@vercel/analytics': specifier: ^1.6.1 - version: 1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) + version: 1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) '@vercel/og': specifier: ^0.8.6 version: 0.8.6 @@ -262,7 +262,7 @@ importers: version: 16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) fumadocs-mdx: specifier: 14.2.7 - version: 14.2.7(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 14.2.7(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) fumadocs-typescript: specifier: ^5.1.2 version: 5.1.4(f245ce4745497b47498caec764b8c0fe) @@ -441,13 +441,13 @@ importers: version: 0.30.6 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) mongodb: specifier: ^7.1.0 version: 7.1.0(socks@2.8.7) mysql2: specifier: ^3.18.2 - version: 3.18.2(@types/node@25.3.3) + version: 3.18.2(@types/node@25.5.0) pg: specifier: ^8.19.0 version: 8.19.0 @@ -580,7 +580,7 @@ importers: version: 0.15.4(solid-js@1.9.11) '@solidjs/start': specifier: ^1.3.2 - version: 1.3.2(solid-js@1.9.11)(vinxi@0.5.11(c866007d9e9a694a62cdd90434e8d3ba))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.3.2(solid-js@1.9.11)(vinxi@0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) better-auth: specifier: workspace:* version: link:../../../packages/better-auth @@ -589,7 +589,7 @@ importers: version: 1.9.11 vinxi: specifier: ^0.5.11 - version: 0.5.11(c866007d9e9a694a62cdd90434e8d3ba) + version: 0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b) devDependencies: '@better-auth-test/test-utils': specifier: workspace:* @@ -621,7 +621,7 @@ importers: version: link:../test-utils vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) e2e/smoke: devDependencies: @@ -642,7 +642,7 @@ importers: version: 5.9.3 msw: specifier: ^2.12.10 - version: 2.12.10(@types/node@25.3.3)(typescript@5.9.3) + version: 2.12.10(@types/node@25.5.0)(typescript@5.9.3) e2e/smoke/test/fixtures/cloudflare: dependencies: @@ -654,14 +654,14 @@ importers: version: link:../../../../../packages/better-auth drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) hono: specifier: ^4.12.7 version: 4.12.7 devDependencies: '@cloudflare/vitest-pool-workers': specifier: ^0.12.18 - version: 0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.0.18)(@vitest/snapshot@4.0.18)(vitest@4.0.18) + version: 0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))) '@cloudflare/workers-types': specifier: ^4.20260226.1 version: 4.20260226.1 @@ -713,7 +713,7 @@ importers: version: link:../../../../../packages/better-auth stripe: specifier: ^20.4.0 - version: 20.4.0(@types/node@25.3.3) + version: 20.4.0(@types/node@25.5.0) e2e/smoke/test/fixtures/tsconfig-exact-optional-property-types: dependencies: @@ -750,7 +750,7 @@ importers: devDependencies: vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) landing: dependencies: @@ -834,7 +834,7 @@ importers: version: 1.36.4 '@vercel/analytics': specifier: ^1.6.1 - version: 1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) + version: 1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) '@vercel/og': specifier: ^0.10.1 version: 0.10.1 @@ -864,7 +864,7 @@ importers: version: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) fumadocs-mdx: specifier: ^14.2.8 - version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) fumadocs-typescript: specifier: ^5.1.4 version: 5.1.4(3749dc07ba6aad1af5ecb0ad432fe651) @@ -942,10 +942,10 @@ importers: version: 0.183.2 typesense: specifier: ^3.0.2 - version: 3.0.2(@babel/runtime@7.28.6) + version: 3.0.2(@babel/runtime@7.29.2) typesense-fumadocs-adapter: specifier: ^0.3.0 - version: 0.3.0(315bbd73201b0530b183e3c1250d4415) + version: 0.3.0(40151152e36b86667babdaa0510dec49) unist-util-visit: specifier: ^5.1.0 version: 5.1.0 @@ -1004,7 +1004,7 @@ importers: version: link:../better-auth tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/better-auth: dependencies: @@ -1046,7 +1046,7 @@ importers: version: 7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) better-call: specifier: 'catalog:' - version: 1.3.2(zod@4.3.6) + version: 2.0.2(zod@4.3.6) defu: specifier: ^6.1.4 version: 6.1.4 @@ -1055,7 +1055,7 @@ importers: version: 0.31.9 drizzle-orm: specifier: '>=0.41.0' - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) jose: specifier: ^6.1.3 version: 6.1.3 @@ -1067,7 +1067,7 @@ importers: version: 7.1.0(socks@2.8.7) mysql2: specifier: ^3.0.0 - version: 3.18.2(@types/node@25.3.3) + version: 3.18.2(@types/node@25.5.0) nanostores: specifier: ^1.1.1 version: 1.1.1 @@ -1087,15 +1087,24 @@ importers: '@lynx-js/react': specifier: ^0.116.3 version: 0.116.3(@types/react@19.2.14) + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 + '@opentelemetry/sdk-trace-base': + specifier: ^1.30.0 + version: 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': + specifier: ^1.30.0 + version: 1.30.1(@opentelemetry/api@1.9.0) '@sveltejs/kit': specifier: ^2.53.3 - version: 2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) '@tanstack/react-start': specifier: ^1.163.2 - version: 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) '@tanstack/solid-start': specifier: ^1.163.2 - version: 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(solid-js@1.9.11)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(solid-js@1.9.11)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) '@types/better-sqlite3': specifier: ^7.6.13 version: 7.6.13 @@ -1125,7 +1134,7 @@ importers: version: 1.9.0 msw: specifier: ^2.12.10 - version: 2.12.10(@types/node@25.3.3)(typescript@5.9.3) + version: 2.12.10(@types/node@25.5.0)(typescript@5.9.3) next: specifier: ^16.1.6 version: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) @@ -1149,7 +1158,7 @@ importers: version: 18.6.2(@azure/core-client@1.10.1) tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) type-fest: specifier: ^5.4.4 version: 5.4.4 @@ -1158,7 +1167,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(msw@2.12.10(@types/node@25.3.3)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) vue: specifier: ^3.5.29 version: 3.5.29(typescript@5.9.3) @@ -1212,7 +1221,7 @@ importers: version: 17.3.1 drizzle-orm: specifier: ^0.41.0 - version: 0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) get-tsconfig: specifier: ^4.13.6 version: 4.13.6 @@ -1261,7 +1270,7 @@ importers: version: 4.56.10(tslib@2.8.1) tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) tsx: specifier: ^4.21.0 version: 4.21.0 @@ -1274,6 +1283,9 @@ importers: packages/core: dependencies: + '@opentelemetry/semantic-conventions': + specifier: ^1.39.0 + version: 1.39.0 '@standard-schema/spec': specifier: ^1.1.0 version: 1.1.0 @@ -1290,9 +1302,18 @@ importers: '@cloudflare/workers-types': specifier: ^4.20250121.0 version: 4.20260226.1 + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 + '@opentelemetry/sdk-trace-base': + specifier: ^1.30.0 + version: 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': + specifier: ^1.30.0 + version: 1.30.1(@opentelemetry/api@1.9.0) better-call: specifier: 'catalog:' - version: 1.3.2(zod@4.3.6) + version: 2.0.2(zod@4.3.6) jose: specifier: ^6.1.3 version: 6.1.3 @@ -1304,7 +1325,7 @@ importers: version: 1.1.1 tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/drizzle-adapter: devDependencies: @@ -1316,10 +1337,10 @@ importers: version: 0.3.1 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1334,7 +1355,7 @@ importers: version: 1.1.21 better-call: specifier: 'catalog:' - version: 1.3.2(zod@4.3.6) + version: 2.0.2(zod@4.3.6) conf: specifier: ^15.0.2 version: 15.1.0 @@ -1359,7 +1380,7 @@ importers: version: 38.8.4 tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/expo: dependencies: @@ -1368,7 +1389,7 @@ importers: version: 1.1.21 better-call: specifier: 'catalog:' - version: 1.3.2(zod@4.3.6) + version: 2.0.2(zod@4.3.6) zod: specifier: ^4.3.6 version: 4.3.6 @@ -1396,7 +1417,7 @@ importers: version: 0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4) tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/i18n: devDependencies: @@ -1408,7 +1429,7 @@ importers: version: link:../better-auth tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/kysely-adapter: devDependencies: @@ -1426,7 +1447,7 @@ importers: version: 0.28.11 tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1441,7 +1462,7 @@ importers: version: 0.3.1 tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1459,7 +1480,7 @@ importers: version: 7.1.0(socks@2.8.7) tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1474,7 +1495,7 @@ importers: version: 1.1.21 better-call: specifier: 'catalog:' - version: 1.3.2(zod@4.3.6) + version: 2.0.2(zod@4.3.6) jose: specifier: ^6.1.3 version: 6.1.3 @@ -1496,7 +1517,7 @@ importers: version: 1.9.0 tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/passkey: dependencies: @@ -1514,7 +1535,7 @@ importers: version: 13.2.3 better-call: specifier: 'catalog:' - version: 1.3.2(zod@4.3.6) + version: 2.0.2(zod@4.3.6) nanostores: specifier: ^1.0.1 version: 1.1.1 @@ -1530,7 +1551,7 @@ importers: version: link:../better-auth tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/prisma-adapter: dependencies: @@ -1549,7 +1570,7 @@ importers: version: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1567,13 +1588,13 @@ importers: version: 5.9.3 tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: catalog:vitest - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) packages/scim: dependencies: @@ -1585,7 +1606,7 @@ importers: version: link:../better-auth better-call: specifier: 'catalog:' - version: 1.3.2(zod@4.3.6) + version: 2.0.2(zod@4.3.6) zod: specifier: ^4.3.6 version: 4.3.6 @@ -1598,7 +1619,7 @@ importers: version: link:../sso tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/sso: dependencies: @@ -1609,8 +1630,8 @@ importers: specifier: 'catalog:' version: 1.1.21 fast-xml-parser: - specifier: ^5.4.1 - version: 5.4.1 + specifier: ^5.5.6 + version: 5.5.6 jose: specifier: ^6.1.3 version: 6.1.3 @@ -1638,7 +1659,7 @@ importers: version: link:../better-auth better-call: specifier: 'catalog:' - version: 1.3.2(zod@4.3.6) + version: 2.0.2(zod@4.3.6) body-parser: specifier: ^2.2.2 version: 2.2.2 @@ -1650,7 +1671,7 @@ importers: version: 8.2.2 tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/stripe: dependencies: @@ -1669,13 +1690,13 @@ importers: version: link:../better-auth better-call: specifier: 'catalog:' - version: 1.3.2(zod@4.3.6) + version: 2.0.2(zod@4.3.6) stripe: specifier: ^20.4.0 - version: 20.4.0(@types/node@25.3.3) + version: 20.4.0(@types/node@25.5.0) tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/telemetry: dependencies: @@ -1691,7 +1712,7 @@ importers: version: link:../core tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) type-fest: specifier: ^5.4.4 version: 5.4.4 @@ -1706,10 +1727,10 @@ importers: version: link:../better-auth tsdown: specifier: 'catalog:' - version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) vitest: specifier: catalog:vitest - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(msw@2.12.10(@types/node@25.3.3)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) test: devDependencies: @@ -1724,16 +1745,16 @@ importers: version: link:../packages/better-auth msw: specifier: ^2.12.10 - version: 2.12.10(@types/node@25.3.3)(typescript@5.9.3) + version: 2.12.10(@types/node@25.5.0)(typescript@5.9.3) openid-client: specifier: ^6.8.2 version: 6.8.2 undici: - specifier: ^7.22.0 - version: 7.22.0 + specifier: ^7.24.0 + version: 7.24.1 vitest: specifier: catalog:vitest - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(msw@2.12.10(@types/node@25.3.3)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) packages: @@ -1980,8 +2001,8 @@ packages: resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} - '@babel/generator@8.0.0-rc.1': - resolution: {integrity: sha512-3ypWOOiC4AYHKr8vYRVtWtWmyvcoItHtVqF8paFax+ydpmUdPsJpLBkBBs5ItmhdrwC3a0ZSqqFAdzls4ODP3w==} + '@babel/generator@8.0.0-rc.2': + resolution: {integrity: sha512-oCQ1IKPwkzCeJzAPb7Fv8rQ9k5+1sG8mf2uoHiMInPYvkRfrDJxbTIbH51U+jstlkghus0vAi3EBvkfvEsYNLQ==} engines: {node: ^20.19.0 || >=22.12.0} '@babel/helper-annotate-as-pure@7.27.3': @@ -2004,8 +2025,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.6': - resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==} + '@babel/helper-define-polyfill-provider@0.6.8': + resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -2067,8 +2088,8 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@8.0.0-rc.1': - resolution: {integrity: sha512-I4YnARytXC2RzkLNVnf5qFNFMzp679qZpmtw/V3Jt2uGnWiIxyJtaukjG7R8pSx8nG2NamICpGfljQsogj+FbQ==} + '@babel/helper-validator-identifier@8.0.0-rc.2': + resolution: {integrity: sha512-xExUBkuXWJjVuIbO7z6q7/BA9bgfJDEhVL0ggrggLMbg0IzCUWGT1hZGE8qUH7Il7/RD/a6cZ3AAFrrlp1LF/A==} engines: {node: ^20.19.0 || >=22.12.0} '@babel/helper-validator-option@7.27.1': @@ -2092,8 +2113,13 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@8.0.0-rc.1': - resolution: {integrity: sha512-6HyyU5l1yK/7h9Ki52i5h6mDAx4qJdiLQO4FdCyJNoB/gy3T3GGJdhQzzbZgvgZCugYBvwtQiWRt94QKedHnkA==} + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@8.0.0-rc.2': + resolution: {integrity: sha512-29AhEtcq4x8Dp3T72qvUMZHx0OMXCj4Jy/TEReQa+KWLln524Cj1fWb3QFi0l/xSpptQBR6y9RNEXuxpFvwiUQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2467,6 +2493,10 @@ packages: resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} @@ -2479,8 +2509,8 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@babel/types@8.0.0-rc.1': - resolution: {integrity: sha512-ubmJ6TShyaD69VE9DQrlXcdkvJbmwWPB8qYj0H2kaJi29O7vJT9ajSdBd2W8CG34pwL9pYA74fi7RHC1qbLoVQ==} + '@babel/types@8.0.0-rc.2': + resolution: {integrity: sha512-91gAaWRznDwSX4E2tZ1YjBuIfnQVOFDCQ2r0Toby0gu4XEbyF623kXLMA8d4ZbCu+fINcrudkmEcwSUHgDDkNw==} engines: {node: ^20.19.0 || >=22.12.0} '@better-auth/utils@0.3.1': @@ -4427,8 +4457,8 @@ packages: resolution: {integrity: sha512-qziF8R9kf7mRNgSpmUH96O0aV1ZiwK4c9ZecFQbDSQuYhgy9GY1WTjiQF0oQnohjTjWNtXhrU39LAeXWNLaBJg==} engines: {node: ^18.14.0 || >=20} - '@netlify/otel@5.1.1': - resolution: {integrity: sha512-WCSlOsd0a0Vn+iPC5PYru7rq/5/QpBGnvam6C7cq9DEiTFqfwExNoxk6SWI0T6nI56gkBryaGsENLTEnUue1lg==} + '@netlify/otel@5.1.3': + resolution: {integrity: sha512-rnyh3V0rHzySPWD2mUys40hV8sDML8l46gGSLl7F+9DN4Y6ivaFXjsvNkSt/3B5ANq5Hw8LAavXgHRefyT8lRw==} engines: {node: ^18.14.0 || >=20.6.1} '@netlify/runtime-utils@2.2.1': @@ -4636,6 +4666,10 @@ packages: resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} engines: {node: '>=14'} + '@opentelemetry/semantic-conventions@1.39.0': + resolution: {integrity: sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==} + engines: {node: '>=14'} + '@orama/cuid2@2.2.3': resolution: {integrity: sha512-Lcak3chblMejdlSHgYU2lS2cdOhDpU6vkfIJH4m+YKvqQyLqs1bB8+w6NT1MG5bO12NUK2GFc34Mn2xshMIQ1g==} @@ -4646,8 +4680,8 @@ packages: '@oramacloud/client@2.1.4': resolution: {integrity: sha512-uNPFs4wq/iOPbggCwTkVNbIr64Vfd7ZS/h+cricXVnzXWocjDTfJ3wLL4lr0qiSu41g8z+eCAGBqJ30RO2O4AA==} - '@oxc-project/types@0.114.0': - resolution: {integrity: sha512-//nBfbzHQHvJs8oFIjv6coZ6uxQ4alLfiPe6D5vit6c4pmxATHHlVwgB1k+Hv4yoAMyncdxgRBF5K4BYWUCzvA==} + '@oxc-project/types@0.115.0': + resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==} '@oxc-resolver/binding-android-arm-eabi@11.19.0': resolution: {integrity: sha512-dlMjjWE3h+qMujLp5nBX/x7R5ny+xfr4YtsyaMNuM5JImOtQBzpFxQr9kJOKGL+9RbaoTOXpt5KF05f9pnOsgw==} @@ -5993,8 +6027,8 @@ packages: '@react-native-masked-view/masked-view': optional: true - '@react-navigation/native-stack@7.14.4': - resolution: {integrity: sha512-HFEnM5Q7JY3FmmiolD/zvgY+9sxZAyVGPZJoz7BdTvJmi1VHOdplf24YiH45mqeitlGnaOlvNT55rH4abHJ5eA==} + '@react-navigation/native-stack@7.14.5': + resolution: {integrity: sha512-NuyMf21kKk3jODvYgpcDA+HwyWr/KEj72ciqquyEupZlsmQ3WNUGgdaixEB3A19+iPOvHLQzDLcoTrrqZk8Leg==} peerDependencies: '@react-navigation/native': ^7.1.33 react: '>= 18.2.0' @@ -6086,83 +6120,97 @@ packages: resolution: {integrity: sha512-C7c51Nn4yTxXFKvgh2txJFNweaVcfUPQxwEUFw4aWsCmfiBDJsTSwviIF8EcwjQ6k8bPyMWCl1vw4BdxE569Cg==} engines: {node: '>= 10'} - '@rolldown/binding-android-arm64@1.0.0-rc.5': - resolution: {integrity: sha512-zCEmUrt1bggwgBgeKLxNj217J1OrChrp3jJt24VK9jAharSTeVaHODNL+LpcQVhRz+FktYWfT9cjo5oZ99ZLpg==} + '@rolldown/binding-android-arm64@1.0.0-rc.8': + resolution: {integrity: sha512-5bcmMQDWEfWUq3m79Mcf/kbO6e5Jr6YjKSsA1RnpXR6k73hQ9z1B17+4h93jXpzHvS18p7bQHM1HN/fSd+9zog==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.5': - resolution: {integrity: sha512-ZP9xb9lPAex36pvkNWCjSEJW/Gfdm9I3ssiqOFLmpZ/vosPXgpoGxCmh+dX1Qs+/bWQE6toNFXWWL8vYoKoK9Q==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.8': + resolution: {integrity: sha512-dcHPd5N4g9w2iiPRJmAvO0fsIWzF2JPr9oSuTjxLL56qu+oML5aMbBMNwWbk58Mt3pc7vYs9CCScwLxdXPdRsg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.5': - resolution: {integrity: sha512-7IdrPunf6dp9mywMgTOKMMGDnMHQ6+h5gRl6LW8rhD8WK2kXX0IwzcM5Zc0B5J7xQs8QWOlKjv8BJsU/1CD3pg==} + '@rolldown/binding-darwin-x64@1.0.0-rc.8': + resolution: {integrity: sha512-mw0VzDvoj8AuR761QwpdCFN0sc/jspuc7eRYJetpLWd+XyansUrH3C7IgNw6swBOgQT9zBHNKsVCjzpfGJlhUA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.5': - resolution: {integrity: sha512-o/JCk+dL0IN68EBhZ4DqfsfvxPfMeoM6cJtxORC1YYoxGHZyth2Kb2maXDb4oddw2wu8iIbnYXYPEzBtAF5CAg==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.8': + resolution: {integrity: sha512-xNrRa6mQ9NmMIJBdJtPMPG8Mso0OhM526pDzc/EKnRrIrrkHD1E0Z6tONZRmUeJElfsQ6h44lQQCcDilSNIvSQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.5': - resolution: {integrity: sha512-IIBwTtA6VwxQLcEgq2mfrUgam7VvPZjhd/jxmeS1npM+edWsrrpRLHUdze+sk4rhb8/xpP3flemgcZXXUW6ukw==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.8': + resolution: {integrity: sha512-WgCKoO6O/rRUwimWfEJDeztwJJmuuX0N2bYLLRxmXDTtCwjToTOqk7Pashl/QpQn3H/jHjx0b5yCMbcTVYVpNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.5': - resolution: {integrity: sha512-KSol1De1spMZL+Xg7K5IBWXIvRWv7+pveaxFWXpezezAG7CS6ojzRjtCGCiLxQricutTAi/LkNWKMsd2wNhMKQ==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.8': + resolution: {integrity: sha512-tOHgTOQa8G4Z3ULj4G3NYOGGJEsqPHR91dT72u63OtVsZ7B6wFJKOx+ZKv+pvwzxWz92/I2ycaqi2/Ll4l+rlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.5': - resolution: {integrity: sha512-WFljyDkxtXRlWxMjxeegf7xMYXxUr8u7JdXlOEWKYgDqEgxUnSEsVDxBiNWQ1D5kQKwf8Wo4sVKEYPRhCdsjwA==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.8': + resolution: {integrity: sha512-oRbxcgDujCi2Yp1GTxoUFsIFlZsuPHU4OV4AzNc3/6aUmR4lfm9FK0uwQu82PJsuUwnF2jFdop3Ep5c1uK7Uxg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.5': - resolution: {integrity: sha512-CUlplTujmbDWp2gamvrqVKi2Or8lmngXT1WxsizJfts7JrvfGhZObciaY/+CbdbS9qNnskvwMZNEhTPrn7b+WA==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.8': + resolution: {integrity: sha512-oaLRyUHw8kQE5M89RqrDJZ10GdmGJcMeCo8tvaE4ukOofqgjV84AbqBSH6tTPjeT2BHv+xlKj678GBuIb47lKA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.8': + resolution: {integrity: sha512-1hjSKFrod5MwBBdLOOA0zpUuSfSDkYIY+QqcMcIU1WOtswZtZdUkcFcZza9b2HcAb0bnpmmyo0LZcaxLb2ov1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.8': + resolution: {integrity: sha512-a1+F0aV4Wy9tT3o+cHl3XhOy6aFV+B8Ll+/JFj98oGkb6lGk3BNgrxd+80RwYRVd23oLGvj3LwluKYzlv1PEuw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.5': - resolution: {integrity: sha512-wdf7g9NbVZCeAo2iGhsjJb7I8ZFfs6X8bumfrWg82VK+8P6AlLXwk48a1ASiJQDTS7Svq2xVzZg3sGO2aXpHRA==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.8': + resolution: {integrity: sha512-bGyXCFU11seFrf7z8PcHSwGEiFVkZ9vs+auLacVOQrVsI8PFHJzzJROF3P6b0ODDmXr0m6Tj5FlDhcXVk0Jp8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.5': - resolution: {integrity: sha512-0CWY7ubu12nhzz+tkpHjoG3IRSTlWYe0wrfJRf4qqjqQSGtAYgoL9kwzdvlhaFdZ5ffVeyYw9qLsChcjUMEloQ==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.8': + resolution: {integrity: sha512-n8d+L2bKgf9G3+AM0bhHFWdlz9vYKNim39ujRTieukdRek0RAo2TfG2uEnV9spa4r4oHUfL9IjcY3M9SlqN1gw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.5': - resolution: {integrity: sha512-LztXnGzv6t2u830mnZrFLRVqT/DPJ9DL4ZTz/y93rqUVkeHjMMYIYaFj+BUthiYxbVH9dH0SZYufETspKY/NhA==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.8': + resolution: {integrity: sha512-4R4iJDIk7BrJdteAbEAICXPoA7vZoY/M0OBfcRlQxzQvUYMcEp2GbC/C8UOgQJhu2TjGTpX1H8vVO1xHWcRqQA==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.5': - resolution: {integrity: sha512-jUct1XVeGtyjqJXEAfvdFa8xoigYZ2rge7nYEm70ppQxpfH9ze2fbIrpHmP2tNM2vL/F6Dd0CpXhpjPbC6bSxQ==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.8': + resolution: {integrity: sha512-3lwnklba9qQOpFnQ7EW+A1m4bZTWXZE4jtehsZ0YOl2ivW1FQqp5gY7X2DLuKITggesyuLwcmqS11fA7NtrmrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.5': - resolution: {integrity: sha512-VQ8F9ld5gw29epjnVGdrx8ugiLTe8BMqmhDYy7nGbdeDo4HAt4bgdZvLbViEhg7DZyHLpiEUlO5/jPSUrIuxRQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.8': + resolution: {integrity: sha512-VGjCx9Ha1P/r3tXGDZyG0Fcq7Q0Afnk64aaKzr1m40vbn1FL8R3W0V1ELDvPgzLXaaqK/9PnsqSaLWXfn6JtGQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -6170,8 +6218,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.40': resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} - '@rolldown/pluginutils@1.0.0-rc.5': - resolution: {integrity: sha512-RxlLX/DPoarZ9PtxVrQgZhPoor987YtKQqCo5zkjX+0S0yLJ7Vv515Wk6+xtTL67VONKJKxETWZwuZjss2idYw==} + '@rolldown/pluginutils@1.0.0-rc.8': + resolution: {integrity: sha512-wzJwL82/arVfeSP3BLr1oTy40XddjtEdrdgtJ4lLRBu06mP3q/8HGM6K0JRlQuTA3XB0pNJx2so/nmpY4xyOew==} '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} @@ -7250,8 +7298,8 @@ packages: '@types/node@25.3.2': resolution: {integrity: sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==} - '@types/node@25.3.3': - resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} + '@types/node@25.5.0': + resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} '@types/offscreencanvas@2019.7.3': resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} @@ -7462,6 +7510,9 @@ packages: '@vitest/expect@4.0.18': resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + '@vitest/expect@4.1.0': + resolution: {integrity: sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==} + '@vitest/mocker@4.0.18': resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} peerDependencies: @@ -7473,18 +7524,41 @@ packages: vite: optional: true + '@vitest/mocker@4.1.0': + resolution: {integrity: sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@4.0.18': resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + '@vitest/pretty-format@4.1.0': + resolution: {integrity: sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==} + '@vitest/runner@4.0.18': resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + '@vitest/runner@4.1.0': + resolution: {integrity: sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==} + '@vitest/snapshot@4.0.18': resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + '@vitest/snapshot@4.1.0': + resolution: {integrity: sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==} + '@vitest/spy@4.0.18': resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + '@vitest/spy@4.1.0': + resolution: {integrity: sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==} + '@vitest/ui@4.0.18': resolution: {integrity: sha512-CGJ25bc8fRi8Lod/3GHSvXRKi7nBo3kxh0ApW4yCjmrWmRmlT53B5E08XRSZRliygG0aVNxLrBEqPYdz/KcCtQ==} peerDependencies: @@ -7493,6 +7567,9 @@ packages: '@vitest/utils@4.0.18': resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + '@vitest/utils@4.1.0': + resolution: {integrity: sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==} + '@vscode/sudo-prompt@9.3.2': resolution: {integrity: sha512-gcXoCN00METUNFeQOFJ+C9xUI0DKB+0EGMVg7wbVYRHBw2Eq3fKisDZOkRdOz3kqXRKOENMfShPOmypw1/8nOw==} @@ -7831,8 +7908,8 @@ packages: peerDependencies: '@babel/core': ^7.20.12 - babel-plugin-polyfill-corejs2@0.4.15: - resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} + babel-plugin-polyfill-corejs2@0.4.17: + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -7841,8 +7918,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.6: - resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==} + babel-plugin-polyfill-regenerator@0.6.8: + resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -7932,8 +8009,8 @@ packages: peerDependencies: better-auth: ^1.0.3 - better-call@1.3.2: - resolution: {integrity: sha512-4cZIfrerDsNTn3cm+MhLbUePN0gdwkhSXEuG7r/zuQ8c/H7iU0/jSK5TD3FW7U0MgKHce/8jGpPYNO4Ve+4NBw==} + better-call@2.0.2: + resolution: {integrity: sha512-QqSKtfJD/ZzQdlm7BTUxT9RCA0AxcrZEMyU/yl7/uoFDoR7YCTdc555xQXjReo75M6/xkskPawPdhbn3fge4Cg==} peerDependencies: zod: ^4.0.0 peerDependenciesMeta: @@ -8090,6 +8167,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -8489,8 +8570,8 @@ packages: copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} - core-js-compat@3.48.0: - resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -8795,6 +8876,9 @@ packages: dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + db0@0.3.4: resolution: {integrity: sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==} peerDependencies: @@ -9372,6 +9456,9 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -9711,15 +9798,15 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-xml-builder@1.0.0: - resolution: {integrity: sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==} + fast-xml-builder@1.1.4: + resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} fast-xml-parser@4.5.4: resolution: {integrity: sha512-jE8ugADnYOBsu1uaoayVl1tVKAMNOXyjwvv2U6udEA2ORBhDooJDWoGxTkhd4Qn4yh59JVVt/pKXtjPwx9OguQ==} hasBin: true - fast-xml-parser@5.4.1: - resolution: {integrity: sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==} + fast-xml-parser@5.5.6: + resolution: {integrity: sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==} hasBin: true fastq@1.20.1: @@ -11115,30 +11202,60 @@ packages: cpu: [arm64] os: [android] + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-darwin-arm64@1.31.1: resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.31.1: resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.31.1: resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.31.1: resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.31.1: resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} engines: {node: '>= 12.0.0'} @@ -11146,6 +11263,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + lightningcss-linux-arm64-musl@1.31.1: resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} @@ -11153,6 +11277,13 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + lightningcss-linux-x64-gnu@1.31.1: resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} @@ -11160,6 +11291,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + lightningcss-linux-x64-musl@1.31.1: resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} @@ -11167,22 +11305,45 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + lightningcss-win32-arm64-msvc@1.31.1: resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.31.1: resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.31.1: resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -12039,8 +12200,8 @@ packages: native-duplexpair@1.0.0: resolution: {integrity: sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==} - needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + needle@3.5.0: + resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==} engines: {node: '>= 4.4.x'} hasBin: true @@ -12470,6 +12631,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-expression-matcher@1.1.3: + resolution: {integrity: sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==} + engines: {node: '>=14.0.0'} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -13583,8 +13748,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rolldown-plugin-dts@0.22.2: - resolution: {integrity: sha512-Ge+XF962Kobjr0hRPx1neVnLU2jpKkD2zevZTfPKf/0el4eYo9SyGPm0stiHDG2JQuL0Q3HLD0Kn+ST8esvVdA==} + rolldown-plugin-dts@0.22.4: + resolution: {integrity: sha512-pueqTPyN1N6lWYivyDGad+j+GO3DT67pzpct8s8e6KGVIezvnrDjejuw1AXFeyDRas3xTq4Ja6Lj5R5/04C5GQ==} engines: {node: '>=20.19.0'} peerDependencies: '@ts-macro/tsc': ^0.3.6 @@ -13602,8 +13767,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-rc.5: - resolution: {integrity: sha512-0AdalTs6hNTioaCYIkAa7+xsmHBfU5hCNclZnM/lp7lGGDuUOb6N4BVNtwiomybbencDjq/waKjTImqiGCs5sw==} + rolldown@1.0.0-rc.8: + resolution: {integrity: sha512-RGOL7mz/aoQpy/y+/XS9iePBfeNRDUdozrhCEJxdpJyimW8v6yp4c30q6OviUU5AnUJVLRL9GP//HUs6N3ALrQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -13678,8 +13843,8 @@ packages: resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} engines: {node: '>=11.0.0'} - sax@1.5.0: - resolution: {integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} scheduler@0.27.0: @@ -13875,6 +14040,10 @@ packages: resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} engines: {node: '>=8.0.0'} + slugify@1.6.8: + resolution: {integrity: sha512-HVk9X1E0gz3mSpoi60h/saazLKXKaZThMLU3u/aNwoYn8/xQyX2MGxL0ui2eaokkD7tF+Zo+cKTHUbe1mmmGzA==} + engines: {node: '>=8.0.0'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -13977,6 +14146,11 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} + srvx@0.11.12: + resolution: {integrity: sha512-AQfrGqntqVPXgP03pvBDN1KyevHC+KmYVqb8vVf4N+aomQqdhaZxjvoVp+AOm4u6x+GgNQY3MVzAUIn+TqwkOA==} + engines: {node: '>=20.16.0'} + hasBin: true + srvx@0.11.8: resolution: {integrity: sha512-2n9t0YnAXPJjinytvxccNgs7rOA5gmE7Wowt/8Dy2dx2fDC6sBhfBpbrCvjYKALlVukPS/Uq3QwkolKNa7P/2Q==} engines: {node: '>=20.16.0'} @@ -14022,6 +14196,9 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.0.0: + resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} + stream-buffers@2.2.0: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} @@ -14118,8 +14295,8 @@ packages: strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - strnum@2.1.2: - resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + strnum@2.2.0: + resolution: {integrity: sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==} structured-headers@0.4.1: resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==} @@ -14247,8 +14424,8 @@ packages: tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@7.5.10: - resolution: {integrity: sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==} + tar@7.5.11: + resolution: {integrity: sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==} engines: {node: '>=18'} tar@7.5.9: @@ -14286,6 +14463,11 @@ packages: engines: {node: '>=10'} hasBin: true + terser@5.46.1: + resolution: {integrity: sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==} + engines: {node: '>=10'} + hasBin: true + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -14348,6 +14530,10 @@ packages: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} + tinyexec@1.0.4: + resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -14356,6 +14542,10 @@ packages: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + engines: {node: '>=14.0.0'} + tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} @@ -14445,28 +14635,31 @@ packages: ts-morph@27.0.2: resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} - tsdown@0.21.0-beta.2: - resolution: {integrity: sha512-OKj8mKf0ws1ucxuEi3mO/OGyfRQxO9MY2D6SoIE/7RZcbojsZSBhJr4xC4MNivMqrQvi3Ke2e+aRZDemPBWPCw==} + tsdown@0.21.1: + resolution: {integrity: sha512-2Qgm5Pztm1ZOBr6AfJ4pAlspuufa5SlnBgnUx7a0QSm0a73FrBETiRB422gHtMKbgWf1oUtjBL/eK+po7OXwKw==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: '@arethetypeswrong/core': ^0.18.1 + '@tsdown/css': 0.21.1 + '@tsdown/exe': 0.21.1 '@vitejs/devtools': '*' publint: ^0.3.0 typescript: ^5.0.0 - unplugin-lightningcss: ^0.4.0 unplugin-unused: ^0.5.0 peerDependenciesMeta: '@arethetypeswrong/core': optional: true + '@tsdown/css': + optional: true + '@tsdown/exe': + optional: true '@vitejs/devtools': optional: true publint: optional: true typescript: optional: true - unplugin-lightningcss: - optional: true unplugin-unused: optional: true @@ -14634,16 +14827,16 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@6.23.0: - resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} + undici@6.24.1: + resolution: {integrity: sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==} engines: {node: '>=18.17'} undici@7.18.2: resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} engines: {node: '>=20.18.1'} - undici@7.22.0: - resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} + undici@7.24.1: + resolution: {integrity: sha512-5xoBibbmnjlcR3jdqtY2Lnx7WbrD/tHlT01TmvqZUFVc9Q1w4+j5hbnapTqbcXITMH1ovjq/W7BkqBilHiVAaA==} engines: {node: '>=20.18.1'} unenv@1.10.0: @@ -14747,8 +14940,8 @@ packages: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} - unrun@0.2.28: - resolution: {integrity: sha512-LqMrI3ZEUMZ2476aCsbUTfy95CHByqez05nju4AQv4XFPkxh5yai7Di1/Qb0FoELHEEPDWhQi23EJeFyrBV0Og==} + unrun@0.2.31: + resolution: {integrity: sha512-qltXRUeKQSrIgVS4NbH6PXEFqq+dru2ivH9QINfB+TinSlslgQvursJEV56QzaX8VaDCV5KfbROwKTQf/APJFA==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: @@ -15092,6 +15285,41 @@ packages: jsdom: optional: true + vitest@4.1.0: + resolution: {integrity: sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.0 + '@vitest/browser-preview': 4.1.0 + '@vitest/browser-webdriverio': 4.1.0 + '@vitest/ui': 4.1.0 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} @@ -15921,10 +16149,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@8.0.0-rc.1': + '@babel/generator@8.0.0-rc.2': dependencies: - '@babel/parser': 8.0.0-rc.1 - '@babel/types': 8.0.0-rc.1 + '@babel/parser': 8.0.0-rc.2 + '@babel/types': 8.0.0-rc.2 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 '@types/jsesc': 2.5.1 @@ -15962,7 +16190,7 @@ snapshots: regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.29.0)': + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 @@ -16039,7 +16267,7 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-identifier@8.0.0-rc.1': {} + '@babel/helper-validator-identifier@8.0.0-rc.2': {} '@babel/helper-validator-option@7.27.1': {} @@ -16067,9 +16295,13 @@ snapshots: dependencies: '@babel/types': 7.29.0 - '@babel/parser@8.0.0-rc.1': + '@babel/parser@7.29.2': dependencies: - '@babel/types': 8.0.0-rc.1 + '@babel/types': 7.29.0 + + '@babel/parser@8.0.0-rc.2': + dependencies: + '@babel/types': 8.0.0-rc.2 '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0)': dependencies: @@ -16417,9 +16649,9 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -16484,6 +16716,8 @@ snapshots: '@babel/runtime@7.28.6': {} + '@babel/runtime@7.29.2': {} + '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 @@ -16507,10 +16741,10 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@8.0.0-rc.1': + '@babel/types@8.0.0-rc.2': dependencies: '@babel/helper-string-parser': 8.0.0-rc.2 - '@babel/helper-validator-identifier': 8.0.0-rc.1 + '@babel/helper-validator-identifier': 8.0.0-rc.2 '@better-auth/utils@0.3.1': {} @@ -16612,14 +16846,14 @@ snapshots: optionalDependencies: workerd: 1.20260305.0 - '@cloudflare/vitest-pool-workers@0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.0.18)(@vitest/snapshot@4.0.18)(vitest@4.0.18)': + '@cloudflare/vitest-pool-workers@0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))': dependencies: - '@vitest/runner': 4.0.18 - '@vitest/snapshot': 4.0.18 + '@vitest/runner': 4.1.0 + '@vitest/snapshot': 4.1.0 cjs-module-lexer: 1.4.3 esbuild: 0.27.3 miniflare: 4.20260305.0 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(msw@2.12.10(@types/node@25.3.3)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) wrangler: 4.69.0(@cloudflare/workers-types@4.20260226.1) transitivePeerDependencies: - '@cloudflare/workers-types' @@ -17382,13 +17616,13 @@ snapshots: resolve.exports: 2.0.3 semver: 7.7.4 send: 0.19.2 - slugify: 1.6.6 + slugify: 1.6.8 source-map-support: 0.5.21 stacktrace-parser: 0.1.11 structured-headers: 0.4.1 - tar: 7.5.10 + tar: 7.5.11 terminal-link: 2.1.1 - undici: 6.23.0 + undici: 6.24.1 wrap-ansi: 7.0.0 ws: 8.19.0 optionalDependencies: @@ -17417,7 +17651,7 @@ snapshots: resolve-from: 5.0.0 semver: 7.7.4 slash: 3.0.0 - slugify: 1.6.6 + slugify: 1.6.8 xcode: 3.0.1 xml2js: 0.6.0 transitivePeerDependencies: @@ -17458,7 +17692,7 @@ snapshots: resolve-from: 5.0.0 resolve-workspace-root: 2.0.1 semver: 7.7.4 - slugify: 1.6.6 + slugify: 1.6.8 sucrase: 3.35.1 transitivePeerDependencies: - supports-color @@ -17562,7 +17796,7 @@ snapshots: glob: 13.0.6 hermes-parser: 0.29.1 jsc-safe-url: 0.2.4 - lightningcss: 1.31.1 + lightningcss: 1.32.0 minimatch: 9.0.9 postcss: 8.4.49 resolve-from: 5.0.0 @@ -17856,12 +18090,12 @@ snapshots: '@types/node': 25.3.2 optional: true - '@inquirer/confirm@5.1.21(@types/node@25.3.3)': + '@inquirer/confirm@5.1.21(@types/node@25.5.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.3) - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.5.0 '@inquirer/core@10.3.2(@types/node@25.3.2)': dependencies: @@ -17877,18 +18111,18 @@ snapshots: '@types/node': 25.3.2 optional: true - '@inquirer/core@10.3.2(@types/node@25.3.3)': + '@inquirer/core@10.3.2(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.5.0) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.5.0 '@inquirer/figures@1.0.15': {} @@ -17897,9 +18131,9 @@ snapshots: '@types/node': 25.3.2 optional: true - '@inquirer/type@3.0.10(@types/node@25.3.3)': + '@inquirer/type@3.0.10(@types/node@25.5.0)': optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.5.0 '@ioredis/commands@1.5.0': {} @@ -18347,7 +18581,7 @@ snapshots: '@netlify/blobs@10.5.0': dependencies: '@netlify/dev-utils': 4.3.3 - '@netlify/otel': 5.1.1 + '@netlify/otel': 5.1.3 '@netlify/runtime-utils': 2.2.1 transitivePeerDependencies: - supports-color @@ -18372,7 +18606,7 @@ snapshots: write-file-atomic: 5.0.1 optional: true - '@netlify/otel@5.1.1': + '@netlify/otel@5.1.3': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) @@ -18528,13 +18762,11 @@ snapshots: '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - optional: true '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 - optional: true '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -18550,20 +18782,17 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - optional: true '@opentelemetry/propagator-jaeger@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - optional: true '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 - optional: true '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': dependencies: @@ -18571,7 +18800,6 @@ snapshots: '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 - optional: true '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': dependencies: @@ -18582,10 +18810,10 @@ snapshots: '@opentelemetry/propagator-jaeger': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) semver: 7.7.4 - optional: true - '@opentelemetry/semantic-conventions@1.28.0': - optional: true + '@opentelemetry/semantic-conventions@1.28.0': {} + + '@opentelemetry/semantic-conventions@1.39.0': {} '@orama/cuid2@2.2.3': dependencies: @@ -18601,7 +18829,7 @@ snapshots: lodash: 4.17.23 optional: true - '@oxc-project/types@0.114.0': {} + '@oxc-project/types@0.115.0': {} '@oxc-resolver/binding-android-arm-eabi@11.19.0': optional: true @@ -20102,7 +20330,7 @@ snapshots: '@react-native/codegen@0.81.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 glob: 7.2.3 hermes-parser: 0.29.1 invariant: 2.2.4 @@ -20112,7 +20340,7 @@ snapshots: '@react-native/codegen@0.83.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 glob: 7.2.3 hermes-parser: 0.32.0 invariant: 2.2.4 @@ -20277,7 +20505,7 @@ snapshots: use-sync-external-store: 1.6.0(react@19.2.4) optional: true - '@react-navigation/native-stack@7.14.4(@react-navigation/native@7.1.33(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.7.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-screens@4.24.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4)': + '@react-navigation/native-stack@7.14.5(@react-navigation/native@7.1.33(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.7.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-screens@4.24.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4)': dependencies: '@react-navigation/elements': 2.9.10(@react-navigation/native@7.1.33(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.7.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) '@react-navigation/native': 7.1.33(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) @@ -20408,50 +20636,56 @@ snapshots: '@resvg/resvg-wasm@2.4.0': {} - '@rolldown/binding-android-arm64@1.0.0-rc.5': + '@rolldown/binding-android-arm64@1.0.0-rc.8': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.5': + '@rolldown/binding-darwin-arm64@1.0.0-rc.8': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.5': + '@rolldown/binding-darwin-x64@1.0.0-rc.8': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.5': + '@rolldown/binding-freebsd-x64@1.0.0-rc.8': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.5': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.8': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.5': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.8': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.5': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.8': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.5': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.8': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.5': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.8': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.5': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.8': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.5': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.8': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.8': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.8': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.5': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.8': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.5': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.8': optional: true '@rolldown/pluginutils@1.0.0-beta.40': {} - '@rolldown/pluginutils@1.0.0-rc.5': {} + '@rolldown/pluginutils@1.0.0-rc.8': {} '@rollup/plugin-alias@6.0.0(rollup@4.59.0)': optionalDependencies: @@ -20886,11 +21120,11 @@ snapshots: dependencies: solid-js: 1.9.11 - '@solidjs/start@1.3.2(solid-js@1.9.11)(vinxi@0.5.11(c866007d9e9a694a62cdd90434e8d3ba))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@solidjs/start@1.3.2(solid-js@1.9.11)(vinxi@0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@tanstack/server-functions-plugin': 1.121.21(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(c866007d9e9a694a62cdd90434e8d3ba)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.11(c866007d9e9a694a62cdd90434e8d3ba)) + '@tanstack/server-functions-plugin': 1.121.21(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b)) cookie-es: 2.0.0 defu: 6.1.4 error-stack-parser: 2.1.4 @@ -20902,8 +21136,8 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.1.0(solid-js@1.9.11) tinyglobby: 0.2.15 - vinxi: 0.5.11(c866007d9e9a694a62cdd90434e8d3ba) - vite-plugin-solid: 2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + vinxi: 0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b) + vite-plugin-solid: 2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) transitivePeerDependencies: - '@testing-library/jest-dom' - solid-js @@ -20922,11 +21156,11 @@ snapshots: dependencies: acorn: 8.16.0 - '@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) '@types/cookie': 0.6.0 acorn: 8.16.0 cookie: 0.6.0 @@ -20938,17 +21172,17 @@ snapshots: set-cookie-parser: 3.0.1 sirv: 3.0.2 svelte: 5.53.5 - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: '@opentelemetry/api': 1.9.0 typescript: 5.9.3 optional: true - '@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) '@types/cookie': 0.6.0 acorn: 8.16.0 cookie: 0.6.0 @@ -20960,48 +21194,48 @@ snapshots: set-cookie-parser: 3.0.1 sirv: 3.0.2 svelte: 5.53.5 - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: '@opentelemetry/api': 1.9.0 typescript: 5.9.3 - '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) obug: 2.1.1 svelte: 5.53.5 - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) optional: true - '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) obug: 2.1.1 svelte: 5.53.5 - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) - '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) debug: 4.4.3 deepmerge: 4.3.1 magic-string: 0.30.21 svelte: 5.53.5 - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.2(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + vitefu: 1.1.2(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) transitivePeerDependencies: - supports-color optional: true - '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) debug: 4.4.3 deepmerge: 4.3.1 magic-string: 0.30.21 svelte: 5.53.5 - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.2(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + vitefu: 1.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) transitivePeerDependencies: - supports-color @@ -21082,7 +21316,7 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.2.1 - '@tanstack/directive-functions-plugin@1.121.21(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/directive-functions-plugin@1.121.21(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.29.0 @@ -21091,7 +21325,7 @@ snapshots: '@tanstack/router-utils': 1.161.4 babel-dead-code-elimination: 1.0.12 tiny-invariant: 1.3.3 - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -21130,19 +21364,19 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/react-start@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tanstack/react-router': 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-start-client': 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-start-server': 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-utils': 1.161.4 '@tanstack/start-client-core': 1.163.2 - '@tanstack/start-plugin-core': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@tanstack/start-plugin-core': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) '@tanstack/start-server-core': 1.163.2 pathe: 2.0.3 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -21186,7 +21420,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/router-plugin@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -21203,8 +21437,8 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vite-plugin-solid: 2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + vite-plugin-solid: 2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) transitivePeerDependencies: - supports-color @@ -21222,7 +21456,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.121.21(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/server-functions-plugin@1.121.21(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.29.0 @@ -21231,7 +21465,7 @@ snapshots: '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 - '@tanstack/directive-functions-plugin': 1.121.21(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@tanstack/directive-functions-plugin': 1.121.21(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) babel-dead-code-elimination: 1.0.12 tiny-invariant: 1.3.3 transitivePeerDependencies: @@ -21272,17 +21506,17 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/solid-start@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(solid-js@1.9.11)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/solid-start@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(solid-js@1.9.11)(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tanstack/solid-router': 1.163.2(solid-js@1.9.11) '@tanstack/solid-start-client': 1.163.2(solid-js@1.9.11) '@tanstack/solid-start-server': 1.163.2(solid-js@1.9.11) '@tanstack/start-client-core': 1.163.2 - '@tanstack/start-plugin-core': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@tanstack/start-plugin-core': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) '@tanstack/start-server-core': 1.163.2 pathe: 2.0.3 solid-js: 1.9.11 - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@rsbuild/core' - '@tanstack/react-router' @@ -21307,7 +21541,7 @@ snapshots: '@tanstack/start-fn-stubs@1.161.4': {} - '@tanstack/start-plugin-core@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/start-plugin-core@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -21315,7 +21549,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.163.2 '@tanstack/router-generator': 1.163.2 - '@tanstack/router-plugin': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@tanstack/router-plugin': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) '@tanstack/router-utils': 1.161.4 '@tanstack/start-client-core': 1.163.2 '@tanstack/start-server-core': 1.163.2 @@ -21327,8 +21561,8 @@ snapshots: srvx: 0.11.8 tinyglobby: 0.2.15 ufo: 1.6.3 - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.2(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + vitefu: 1.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) xmlbuilder2: 4.0.3 zod: 3.25.76 transitivePeerDependencies: @@ -21826,7 +22060,7 @@ snapshots: dependencies: undici-types: 7.18.2 - '@types/node@25.3.3': + '@types/node@25.5.0': dependencies: undici-types: 7.18.2 @@ -21981,20 +22215,20 @@ snapshots: '@use-gesture/core': 10.3.1 react: 19.2.4 - '@vercel/analytics@1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3))': + '@vercel/analytics@1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3))': optionalDependencies: '@remix-run/react': 2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - '@sveltejs/kit': 2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 svelte: 5.53.5 vue: 3.5.29(typescript@5.9.3) vue-router: 4.6.4(vue@3.5.29(typescript@5.9.3)) - '@vercel/analytics@1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3))': + '@vercel/analytics@1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3))': optionalDependencies: '@remix-run/react': 2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - '@sveltejs/kit': 2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 svelte: 5.53.5 @@ -22054,7 +22288,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.11(c866007d9e9a694a62cdd90434e8d3ba))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b))': dependencies: '@babel/parser': 7.29.0 acorn: 8.16.0 @@ -22065,18 +22299,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.11(c866007d9e9a694a62cdd90434e8d3ba) + vinxi: 0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b) - '@vinxi/server-components@0.5.1(vinxi@0.5.11(c866007d9e9a694a62cdd90434e8d3ba))': + '@vinxi/server-components@0.5.1(vinxi@0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(c866007d9e9a694a62cdd90434e8d3ba)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b)) acorn: 8.16.0 acorn-loose: 8.5.2 acorn-typescript: 1.4.13(acorn@8.16.0) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.11(c866007d9e9a694a62cdd90434e8d3ba) + vinxi: 0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b) '@vitest/coverage-istanbul@4.0.18(vitest@4.0.18)': dependencies: @@ -22090,7 +22324,7 @@ snapshots: magicast: 0.5.2 obug: 2.1.1 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -22103,41 +22337,77 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/expect@4.1.0': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.0 + '@vitest/utils': 4.1.0 + chai: 6.2.2 + tinyrainbow: 3.1.0 + + '@vitest/mocker@4.0.18(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.10(@types/node@25.3.2)(typescript@5.9.3) - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.0.18(msw@2.12.10(@types/node@25.3.3)(typescript@5.9.3))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.12.10(@types/node@25.3.3)(typescript@5.9.3) - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + msw: 2.12.10(@types/node@25.5.0)(typescript@5.9.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + + '@vitest/mocker@4.1.0(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@vitest/spy': 4.1.0 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.12.10(@types/node@25.5.0)(typescript@5.9.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@4.0.18': dependencies: tinyrainbow: 3.0.3 + '@vitest/pretty-format@4.1.0': + dependencies: + tinyrainbow: 3.1.0 + '@vitest/runner@4.0.18': dependencies: '@vitest/utils': 4.0.18 pathe: 2.0.3 + '@vitest/runner@4.1.0': + dependencies: + '@vitest/utils': 4.1.0 + pathe: 2.0.3 + '@vitest/snapshot@4.0.18': dependencies: '@vitest/pretty-format': 4.0.18 magic-string: 0.30.21 pathe: 2.0.3 + '@vitest/snapshot@4.1.0': + dependencies: + '@vitest/pretty-format': 4.1.0 + '@vitest/utils': 4.1.0 + magic-string: 0.30.21 + pathe: 2.0.3 + '@vitest/spy@4.0.18': {} + '@vitest/spy@4.1.0': {} + '@vitest/ui@4.0.18(vitest@4.0.18)': dependencies: '@vitest/utils': 4.0.18 @@ -22147,13 +22417,19 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) '@vitest/utils@4.0.18': dependencies: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 + '@vitest/utils@4.1.0': + dependencies: + '@vitest/pretty-format': 4.1.0 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + '@vscode/sudo-prompt@9.3.2': optional: true @@ -22466,7 +22742,7 @@ snapshots: ast-kit@3.0.0-beta.1: dependencies: - '@babel/parser': 8.0.0-rc.1 + '@babel/parser': 8.0.0-rc.2 estree-walker: 3.0.3 pathe: 2.0.3 @@ -22554,11 +22830,11 @@ snapshots: html-entities: 2.3.3 parse5: 7.3.0 - babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.29.0): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): dependencies: '@babel/compat-data': 7.29.0 '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -22566,15 +22842,15 @@ snapshots: babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) - core-js-compat: 3.48.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.29.0): + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) transitivePeerDependencies: - supports-color @@ -22617,7 +22893,7 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) - babel-preset-expo@54.0.10(@babel/core@7.29.0)(@babel/runtime@7.28.6)(expo@54.0.33)(react-refresh@0.14.2): + babel-preset-expo@54.0.10(@babel/core@7.29.0)(@babel/runtime@7.29.2)(expo@54.0.33)(react-refresh@0.14.2): dependencies: '@babel/helper-module-imports': 7.28.6 '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) @@ -22643,7 +22919,7 @@ snapshots: react-refresh: 0.14.2 resolve-from: 5.0.0 optionalDependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.2 expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.13.0)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - '@babel/core' @@ -22687,7 +22963,7 @@ snapshots: mailchecker: 6.0.19 validator: 13.15.26 - better-call@1.3.2(zod@4.3.6): + better-call@2.0.2(zod@4.3.6): dependencies: '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 @@ -22930,6 +23206,8 @@ snapshots: cac@6.7.14: {} + cac@7.0.0: {} + cacheable-lookup@5.0.4: {} cacheable-request@7.0.4: @@ -23029,7 +23307,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.22.0 + undici: 7.24.1 whatwg-mimetype: 4.0.0 chevrotain-allstar@0.3.1(chevrotain@11.1.2): @@ -23365,7 +23643,7 @@ snapshots: is-what: 3.14.1 optional: true - core-js-compat@3.48.0: + core-js-compat@3.49.0: dependencies: browserslist: 4.28.1 @@ -23747,13 +24025,16 @@ snapshots: dayjs@1.11.19: {} - db0@0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.3.3)): + dayjs@1.11.20: + optional: true + + db0@0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.5.0)): optionalDependencies: '@electric-sql/pglite': 0.3.15 '@libsql/client': 0.17.0(encoding@0.1.13) better-sqlite3: 12.6.2 - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) - mysql2: 3.18.2(@types/node@25.3.3) + drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + mysql2: 3.18.2(@types/node@25.5.0) debounce-fn@6.0.0: dependencies: @@ -23937,7 +24218,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): + drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260226.1 '@electric-sql/pglite': 0.3.15 @@ -23950,12 +24231,12 @@ snapshots: bun-types: 1.3.9 gel: 2.2.0 kysely: 0.28.11 - mysql2: 3.18.2(@types/node@25.3.3) + mysql2: 3.18.2(@types/node@25.5.0) pg: 8.19.0 postgres: 3.4.8 prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): + drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260226.1 '@electric-sql/pglite': 0.3.15 @@ -23969,12 +24250,12 @@ snapshots: bun-types: 1.3.9 gel: 2.2.0 kysely: 0.28.11 - mysql2: 3.18.2(@types/node@25.3.3) + mysql2: 3.18.2(@types/node@25.5.0) pg: 8.19.0 postgres: 3.4.8 prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): + drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260226.1 '@electric-sql/pglite': 0.3.15 @@ -23988,7 +24269,7 @@ snapshots: bun-types: 1.3.9 gel: 2.2.0 kysely: 0.28.11 - mysql2: 3.18.2(@types/node@25.3.3) + mysql2: 3.18.2(@types/node@25.5.0) pg: 8.19.0 postgres: 3.4.8 prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) @@ -24135,6 +24416,8 @@ snapshots: es-module-lexer@1.7.0: {} + es-module-lexer@2.0.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -24532,7 +24815,7 @@ snapshots: '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@react-navigation/bottom-tabs': 7.15.5(@react-navigation/native@7.1.33(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.7.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-screens@4.24.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) '@react-navigation/native': 7.1.33(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) - '@react-navigation/native-stack': 7.14.4(@react-navigation/native@7.1.33(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.7.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-screens@4.24.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) + '@react-navigation/native-stack': 7.14.5(@react-navigation/native@7.1.33(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.7.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-screens@4.24.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) client-only: 0.0.1 debug: 4.4.3 escape-string-regexp: 4.0.0 @@ -24574,7 +24857,7 @@ snapshots: expo@54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.13.0)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4): dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.2 '@expo/cli': 54.0.23(expo-router@6.0.23)(expo@54.0.33)(graphql@16.13.0)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4)) '@expo/config': 12.0.13 '@expo/config-plugins': 54.0.4 @@ -24584,7 +24867,7 @@ snapshots: '@expo/metro-config': 54.0.14(expo@54.0.33) '@expo/vector-icons': 15.1.1(expo-font@14.0.11(expo@54.0.33)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) '@ungap/structured-clone': 1.3.0 - babel-preset-expo: 54.0.10(@babel/core@7.29.0)(@babel/runtime@7.28.6)(expo@54.0.33)(react-refresh@0.14.2) + babel-preset-expo: 54.0.10(@babel/core@7.29.0)(@babel/runtime@7.29.2)(expo@54.0.33)(react-refresh@0.14.2) expo-asset: 12.0.12(expo@54.0.33)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) expo-constants: 18.0.13(expo@54.0.33)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4)) expo-file-system: 19.0.21(expo@54.0.33)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4)) @@ -24689,17 +24972,20 @@ snapshots: fast-uri@3.1.0: {} - fast-xml-builder@1.0.0: {} + fast-xml-builder@1.1.4: + dependencies: + path-expression-matcher: 1.1.3 fast-xml-parser@4.5.4: dependencies: strnum: 1.1.2 optional: true - fast-xml-parser@5.4.1: + fast-xml-parser@5.5.6: dependencies: - fast-xml-builder: 1.0.0 - strnum: 2.1.2 + fast-xml-builder: 1.1.4 + path-expression-matcher: 1.1.3 + strnum: 2.2.0 fastq@1.20.1: dependencies: @@ -24960,7 +25246,7 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-mdx@14.2.7(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + fumadocs-mdx@14.2.7(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 @@ -24988,11 +25274,11 @@ snapshots: mdast-util-mdx-jsx: 3.2.0 next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - fumadocs-mdx@14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + fumadocs-mdx@14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 @@ -25019,7 +25305,7 @@ snapshots: mdast-util-directive: 3.1.0 next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -25338,7 +25624,7 @@ snapshots: h3@2.0.1-rc.14: dependencies: rou3: 0.7.12 - srvx: 0.11.8 + srvx: 0.11.12 hachure-fill@0.5.2: {} @@ -26193,7 +26479,7 @@ snapshots: image-size: 0.5.5 make-dir: 2.1.0 mime: 1.6.0 - needle: 3.3.1 + needle: 3.5.0 source-map: 0.6.1 optional: true @@ -26233,36 +26519,69 @@ snapshots: lightningcss-android-arm64@1.31.1: optional: true + lightningcss-android-arm64@1.32.0: + optional: true + lightningcss-darwin-arm64@1.31.1: optional: true + lightningcss-darwin-arm64@1.32.0: + optional: true + lightningcss-darwin-x64@1.31.1: optional: true + lightningcss-darwin-x64@1.32.0: + optional: true + lightningcss-freebsd-x64@1.31.1: optional: true + lightningcss-freebsd-x64@1.32.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.31.1: optional: true + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + lightningcss-linux-arm64-gnu@1.31.1: optional: true + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + lightningcss-linux-arm64-musl@1.31.1: optional: true + lightningcss-linux-arm64-musl@1.32.0: + optional: true + lightningcss-linux-x64-gnu@1.31.1: optional: true + lightningcss-linux-x64-gnu@1.32.0: + optional: true + lightningcss-linux-x64-musl@1.31.1: optional: true + lightningcss-linux-x64-musl@1.32.0: + optional: true + lightningcss-win32-arm64-msvc@1.31.1: optional: true + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + lightningcss-win32-x64-msvc@1.31.1: optional: true + lightningcss-win32-x64-msvc@1.32.0: + optional: true + lightningcss@1.31.1: dependencies: detect-libc: 2.1.2 @@ -26279,6 +26598,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.31.1 lightningcss-win32-x64-msvc: 1.31.1 + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + lilconfig@2.1.0: {} linebreak@1.1.0: @@ -26378,7 +26713,7 @@ snapshots: logkitty@0.7.1: dependencies: ansi-fragments: 0.2.1 - dayjs: 1.11.19 + dayjs: 1.11.20 yargs: 15.4.1 optional: true @@ -26443,7 +26778,7 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 source-map-js: 1.2.1 optional: true @@ -26979,7 +27314,7 @@ snapshots: metro-minify-terser@0.83.3: dependencies: flow-enums-runtime: 0.0.6 - terser: 5.46.0 + terser: 5.46.1 metro-minify-terser@0.83.4: dependencies: @@ -26989,7 +27324,7 @@ snapshots: metro-minify-terser@0.83.5: dependencies: flow-enums-runtime: 0.0.6 - terser: 5.46.0 + terser: 5.46.1 optional: true metro-resolver@0.83.3: @@ -27007,7 +27342,7 @@ snapshots: metro-runtime@0.83.3: dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.2 flow-enums-runtime: 0.0.6 metro-runtime@0.83.4: @@ -27017,7 +27352,7 @@ snapshots: metro-runtime@0.83.5: dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.2 flow-enums-runtime: 0.0.6 optional: true @@ -27137,7 +27472,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 flow-enums-runtime: 0.0.6 metro: 0.83.3 @@ -27177,7 +27512,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 flow-enums-runtime: 0.0.6 metro: 0.83.5 @@ -27199,7 +27534,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -27293,7 +27628,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -27768,9 +28103,9 @@ snapshots: - '@types/node' optional: true - msw@2.12.10(@types/node@25.3.3)(typescript@5.9.3): + msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3): dependencies: - '@inquirer/confirm': 5.1.21(@types/node@25.3.3) + '@inquirer/confirm': 5.1.21(@types/node@25.5.0) '@mswjs/interceptors': 0.41.3 '@open-draft/deferred-promise': 2.2.0 '@types/statuses': 2.0.6 @@ -27807,9 +28142,9 @@ snapshots: seq-queue: 0.0.5 sqlstring: 2.3.3 - mysql2@3.18.2(@types/node@25.3.3): + mysql2@3.18.2(@types/node@25.5.0): dependencies: - '@types/node': 25.3.3 + '@types/node': 25.5.0 aws-ssl-profiles: 1.1.2 denque: 2.1.0 generate-function: 2.3.1 @@ -27839,10 +28174,10 @@ snapshots: native-duplexpair@1.0.0: {} - needle@3.3.1: + needle@3.5.0: dependencies: iconv-lite: 0.6.3 - sax: 1.5.0 + sax: 1.6.0 optional: true negotiator@0.6.3: {} @@ -27886,7 +28221,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - nitropack@2.13.1(@azure/identity@4.13.0)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@netlify/blobs@10.5.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(encoding@0.1.13)(mysql2@3.18.2(@types/node@25.3.3))(rolldown@1.0.0-rc.5): + nitropack@2.13.1(@azure/identity@4.13.0)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@netlify/blobs@10.5.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(encoding@0.1.13)(mysql2@3.18.2(@types/node@25.5.0))(rolldown@1.0.0-rc.8): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.59.0) @@ -27907,7 +28242,7 @@ snapshots: cookie-es: 2.0.0 croner: 9.1.0 crossws: 0.3.5 - db0: 0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.3.3)) + db0: 0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.5.0)) defu: 6.1.4 destr: 2.0.5 dot-prop: 10.1.0 @@ -27939,7 +28274,7 @@ snapshots: pretty-bytes: 7.1.0 radix3: 1.1.2 rollup: 4.59.0 - rollup-plugin-visualizer: 6.0.5(rolldown@1.0.0-rc.5)(rollup@4.59.0) + rollup-plugin-visualizer: 6.0.5(rolldown@1.0.0-rc.8)(rollup@4.59.0) scule: 1.3.0 semver: 7.7.4 serve-placeholder: 2.0.2 @@ -27953,7 +28288,7 @@ snapshots: unenv: 2.0.0-rc.24 unimport: 5.7.0 unplugin-utils: 0.3.1 - unstorage: 1.17.4(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(@upstash/redis@1.36.4)(db0@0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.3.3)))(ioredis@5.9.3) + unstorage: 1.17.4(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(@upstash/redis@1.36.4)(db0@0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.5.0)))(ioredis@5.9.3) untyped: 2.0.0 unwasm: 0.5.3 youch: 4.1.0 @@ -28459,6 +28794,8 @@ snapshots: path-exists@4.0.0: {} + path-expression-matcher@1.1.3: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -30322,50 +30659,52 @@ snapshots: robust-predicates@3.0.2: {} - rolldown-plugin-dts@0.22.2(oxc-resolver@11.19.0)(rolldown@1.0.0-rc.5)(typescript@5.9.3): + rolldown-plugin-dts@0.22.4(oxc-resolver@11.19.0)(rolldown@1.0.0-rc.8)(typescript@5.9.3): dependencies: - '@babel/generator': 8.0.0-rc.1 - '@babel/helper-validator-identifier': 8.0.0-rc.1 - '@babel/parser': 8.0.0-rc.1 - '@babel/types': 8.0.0-rc.1 + '@babel/generator': 8.0.0-rc.2 + '@babel/helper-validator-identifier': 8.0.0-rc.2 + '@babel/parser': 8.0.0-rc.2 + '@babel/types': 8.0.0-rc.2 ast-kit: 3.0.0-beta.1 birpc: 4.0.0 dts-resolver: 2.1.3(oxc-resolver@11.19.0) get-tsconfig: 4.13.6 obug: 2.1.1 - rolldown: 1.0.0-rc.5 + rolldown: 1.0.0-rc.8 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver - rolldown@1.0.0-rc.5: + rolldown@1.0.0-rc.8: dependencies: - '@oxc-project/types': 0.114.0 - '@rolldown/pluginutils': 1.0.0-rc.5 + '@oxc-project/types': 0.115.0 + '@rolldown/pluginutils': 1.0.0-rc.8 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.5 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.5 - '@rolldown/binding-darwin-x64': 1.0.0-rc.5 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.5 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.5 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.5 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.5 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.5 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.5 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.5 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.5 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.5 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.5 - - rollup-plugin-visualizer@6.0.5(rolldown@1.0.0-rc.5)(rollup@4.59.0): + '@rolldown/binding-android-arm64': 1.0.0-rc.8 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.8 + '@rolldown/binding-darwin-x64': 1.0.0-rc.8 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.8 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.8 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.8 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.8 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.8 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.8 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.8 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.8 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.8 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.8 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.8 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.8 + + rollup-plugin-visualizer@6.0.5(rolldown@1.0.0-rc.8)(rollup@4.59.0): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rolldown: 1.0.0-rc.5 + rolldown: 1.0.0-rc.8 rollup: 4.59.0 rollup@4.59.0: @@ -30489,7 +30828,7 @@ snapshots: sax@1.4.4: {} - sax@1.5.0: + sax@1.6.0: optional: true scheduler@0.27.0: {} @@ -30765,6 +31104,8 @@ snapshots: slugify@1.6.6: {} + slugify@1.6.8: {} + smart-buffer@4.2.0: optional: true @@ -30861,6 +31202,8 @@ snapshots: sqlstring@2.3.3: {} + srvx@0.11.12: {} + srvx@0.11.8: {} stack-utils@2.0.6: @@ -30895,6 +31238,8 @@ snapshots: std-env@3.10.0: {} + std-env@4.0.0: {} + stream-buffers@2.2.0: {} stream-combiner@0.0.4: @@ -30983,14 +31328,14 @@ snapshots: dependencies: js-tokens: 9.0.1 - stripe@20.4.0(@types/node@25.3.3): + stripe@20.4.0(@types/node@25.5.0): optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.5.0 strnum@1.1.2: optional: true - strnum@2.1.2: {} + strnum@2.2.0: {} structured-headers@0.4.1: {} @@ -31138,7 +31483,7 @@ snapshots: - bare-abort-controller - react-native-b4a - tar@7.5.10: + tar@7.5.11: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -31197,6 +31542,13 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + terser@5.46.1: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 + commander: 2.20.3 + source-map-support: 0.5.21 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -31255,6 +31607,8 @@ snapshots: tinyexec@1.0.2: {} + tinyexec@1.0.4: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -31262,6 +31616,8 @@ snapshots: tinyrainbow@3.0.3: {} + tinyrainbow@3.1.0: {} + tldts-core@6.1.86: {} tldts-core@7.0.23: {} @@ -31339,24 +31695,24 @@ snapshots: '@ts-morph/common': 0.28.1 code-block-writer: 13.0.3 - tsdown@0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3): + tsdown@0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3): dependencies: ansis: 4.2.0 - cac: 6.7.14 + cac: 7.0.0 defu: 6.1.4 empathic: 2.0.0 hookable: 6.0.1 import-without-cache: 0.2.5 obug: 2.1.1 picomatch: 4.0.3 - rolldown: 1.0.0-rc.5 - rolldown-plugin-dts: 0.22.2(oxc-resolver@11.19.0)(rolldown@1.0.0-rc.5)(typescript@5.9.3) + rolldown: 1.0.0-rc.8 + rolldown-plugin-dts: 0.22.4(oxc-resolver@11.19.0)(rolldown@1.0.0-rc.8)(typescript@5.9.3) semver: 7.7.4 tinyexec: 1.0.2 tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig-core: 7.5.0 - unrun: 0.2.28(synckit@0.11.11) + unrun: 0.2.31(synckit@0.11.11) optionalDependencies: '@arethetypeswrong/core': 0.18.2 publint: 0.3.17 @@ -31468,18 +31824,18 @@ snapshots: typescript@5.9.3: {} - typesense-fumadocs-adapter@0.3.0(315bbd73201b0530b183e3c1250d4415): + typesense-fumadocs-adapter@0.3.0(40151152e36b86667babdaa0510dec49): dependencies: fumadocs-core: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) fumadocs-ui: 16.6.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) typescript: 5.9.3 - typesense: 3.0.2(@babel/runtime@7.28.6) + typesense: 3.0.2(@babel/runtime@7.29.2) - typesense@3.0.2(@babel/runtime@7.28.6): + typesense@3.0.2(@babel/runtime@7.29.2): dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.2 axios: 1.13.5 loglevel: 1.9.2 tslib: 2.8.1 @@ -31514,11 +31870,11 @@ snapshots: undici-types@7.18.2: {} - undici@6.23.0: {} + undici@6.24.1: {} undici@7.18.2: {} - undici@7.22.0: {} + undici@7.24.1: {} unenv@1.10.0: dependencies: @@ -31705,13 +32061,13 @@ snapshots: picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 - unrun@0.2.28(synckit@0.11.11): + unrun@0.2.31(synckit@0.11.11): dependencies: - rolldown: 1.0.0-rc.5 + rolldown: 1.0.0-rc.8 optionalDependencies: synckit: 0.11.11 - unstorage@1.17.4(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(@upstash/redis@1.36.4)(db0@0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.3.3)))(ioredis@5.9.3): + unstorage@1.17.4(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(@upstash/redis@1.36.4)(db0@0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.5.0)))(ioredis@5.9.3): dependencies: anymatch: 3.1.3 chokidar: 5.0.0 @@ -31725,7 +32081,7 @@ snapshots: '@azure/identity': 4.13.0 '@netlify/blobs': 10.5.0 '@upstash/redis': 1.36.4 - db0: 0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.3.3)) + db0: 0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.5.0)) ioredis: 5.9.3 until-async@3.0.2: {} @@ -31882,7 +32238,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vinxi@0.5.11(c866007d9e9a694a62cdd90434e8d3ba): + vinxi@0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b): dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -31903,7 +32259,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.13.1(@azure/identity@4.13.0)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@netlify/blobs@10.5.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(encoding@0.1.13)(mysql2@3.18.2(@types/node@25.3.3))(rolldown@1.0.0-rc.5) + nitropack: 2.13.1(@azure/identity@4.13.0)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@netlify/blobs@10.5.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(encoding@0.1.13)(mysql2@3.18.2(@types/node@25.5.0))(rolldown@1.0.0-rc.8) node-fetch-native: 1.6.7 path-to-regexp: 6.3.0 pathe: 1.1.2 @@ -31915,8 +32271,8 @@ snapshots: ufo: 1.6.3 unctx: 2.5.0 unenv: 1.10.0 - unstorage: 1.17.4(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(@upstash/redis@1.36.4)(db0@0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.3.3)))(ioredis@5.9.3) - vite: 6.4.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + unstorage: 1.17.4(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(@upstash/redis@1.36.4)(db0@0.3.4(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.18.2(@types/node@25.5.0)))(ioredis@5.9.3) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) zod: 4.3.6 transitivePeerDependencies: - '@azure/app-configuration' @@ -31963,7 +32319,7 @@ snapshots: - xml2js - yaml - vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 @@ -31971,12 +32327,12 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.11 solid-refresh: 0.6.3(solid-js@1.9.11) - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.2(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + vitefu: 1.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) transitivePeerDependencies: - supports-color - vite@6.4.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -31985,17 +32341,17 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.5.0 fsevents: 2.3.3 jiti: 2.6.1 less: 4.5.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 sass: 1.97.1 - terser: 5.46.0 + terser: 5.46.1 tsx: 4.21.0 yaml: 2.8.2 - vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -32008,13 +32364,13 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 less: 4.5.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 sass: 1.97.1 - terser: 5.46.0 + terser: 5.46.1 tsx: 4.21.0 yaml: 2.8.2 - vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -32023,29 +32379,29 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.5.0 fsevents: 2.3.3 jiti: 2.6.1 less: 4.5.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 sass: 1.97.1 - terser: 5.46.0 + terser: 5.46.1 tsx: 4.21.0 yaml: 2.8.2 - vitefu@1.1.2(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vitefu@1.1.2(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): optionalDependencies: - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) optional: true - vitefu@1.1.2(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vitefu@1.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): optionalDependencies: - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -32062,7 +32418,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -32082,10 +32438,10 @@ snapshots: - tsx - yaml - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(msw@2.12.10(@types/node@25.3.3)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.3.3)(typescript@5.9.3))(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -32102,11 +32458,11 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 - '@types/node': 25.3.3 + '@types/node': 25.5.0 '@vitest/ui': 4.0.18(vitest@4.0.18) happy-dom: 20.7.0 transitivePeerDependencies: @@ -32122,6 +32478,36 @@ snapshots: - tsx - yaml + vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + '@vitest/expect': 4.1.0 + '@vitest/mocker': 4.1.0(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.1.0 + '@vitest/runner': 4.1.0 + '@vitest/snapshot': 4.1.0 + '@vitest/spy': 4.1.0 + '@vitest/utils': 4.1.0 + es-module-lexer: 2.0.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 4.0.0 + tinybench: 2.9.0 + tinyexec: 1.0.4 + tinyglobby: 0.2.15 + tinyrainbow: 3.1.0 + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + '@types/node': 25.5.0 + '@vitest/ui': 4.0.18(vitest@4.0.18) + happy-dom: 20.7.0 + transitivePeerDependencies: + - msw + vlq@1.0.1: {} vscode-jsonrpc@8.2.0: {} From ccded8be396e6365da3cce7ef004fb94eeba83e5 Mon Sep 17 00:00:00 2001 From: Dylan Vanmali Date: Wed, 18 Mar 2026 09:55:12 -0700 Subject: [PATCH 81/88] fix(oauth-provider): improve allowed paths for oauth_query for client plugin (#8320) --- packages/oauth-provider/src/client.ts | 18 +--- packages/oauth-provider/src/oauth.test.ts | 100 +++++++++++++++++++--- 2 files changed, 90 insertions(+), 28 deletions(-) diff --git a/packages/oauth-provider/src/client.ts b/packages/oauth-provider/src/client.ts index b5278e5fca6..ad95e59c2f4 100644 --- a/packages/oauth-provider/src/client.ts +++ b/packages/oauth-provider/src/client.ts @@ -33,24 +33,14 @@ export const oauthProviderClient = () => { : safeJSONParse>(ctx.body ?? "{}") : ctx.body; if (body?.oauth_query) return; - const pathname = - typeof ctx.url === "string" - ? new URL(ctx.url).pathname - : ctx.url.pathname; - // Should only need to run for /sign-in/email, /sign-in/social, /sign-in/oauth2, /oauth2/consent, /oauth2/continue if ( - pathname.endsWith("/sign-in/email") || - pathname.endsWith("/sign-in/social") || - pathname.endsWith("/sign-in/oauth2") || - pathname.endsWith("/oauth2/consent") || - pathname.endsWith("/oauth2/continue") + typeof window !== "undefined" && + window?.location?.search && + !(ctx.method === "GET" || ctx.method === "DELETE") ) { ctx.body = JSON.stringify({ ...body, - oauth_query: - typeof window !== "undefined" - ? parseSignedQuery(window?.location?.search) - : undefined, + oauth_query: parseSignedQuery(window.location.search), }); } }, diff --git a/packages/oauth-provider/src/oauth.test.ts b/packages/oauth-provider/src/oauth.test.ts index 7060229b96f..1a64b059176 100644 --- a/packages/oauth-provider/src/oauth.test.ts +++ b/packages/oauth-provider/src/oauth.test.ts @@ -447,6 +447,7 @@ describe("oauth - prompt", async () => { const scopes = ["openid", "profile", "email", "offline_access", "read:posts"]; let enableSelectAccount = false; let enablePostLogin = false; + let selectedPostLogin = false; let isUserRegistered = true; const { auth: authorizationServer, @@ -481,10 +482,12 @@ describe("oauth - prompt", async () => { page: "/select-organization", shouldRedirect({ session }) { if (!enablePostLogin) return false; + if (selectedPostLogin) return false; return !session?.activeOrganizationId; }, consentReferenceId({ session }) { if (!enablePostLogin) return undefined; + if (selectedPostLogin) return undefined; const activeOrganizationId = (session?.activeOrganizationId ?? undefined) as string | undefined; if (!activeOrganizationId) @@ -1426,6 +1429,84 @@ describe("oauth - prompt", async () => { enableSelectAccount = false; }); + it("shall allow user to post login via continue", async ({ + onTestFinished, + }) => { + if (!oauthClient?.client_id || !oauthClient?.client_secret) { + throw Error("beforeAll not run properly"); + } + enablePostLogin = true; + const { customFetchImpl: customFetchImplRP, cookieSetter } = + await createTestInstance(); + const client = createAuthClient({ + plugins: [genericOAuthClient(), organization()], + baseURL: rpBaseUrl, + fetchOptions: { + customFetchImpl: customFetchImplRP, + }, + }); + + // Generate authorize url + const oauthHeaders = new Headers(); + const data = await client.signIn.oauth2( + { + providerId, + callbackURL: "/success", + }, + { + headers, + throw: true, + onSuccess: cookieSetter(oauthHeaders), + }, + ); + expect(data.url).toContain( + `${authServerBaseUrl}/api/auth/oauth2/authorize`, + ); + expect(data.url).toContain(`client_id=${oauthClient.client_id}`); + + // Check for redirection to /select-organization + let selectOrgRedirectUri = ""; + await serverClient.$fetch(data.url, { + method: "GET", + headers, + onError(context) { + selectOrgRedirectUri = context.response.headers.get("Location") || ""; + cookieSetter(headers)(context); + }, + }); + expect(selectOrgRedirectUri).toContain(`/select-organization`); + expect(selectOrgRedirectUri).toContain( + `client_id=${oauthClient.client_id}`, + ); + expect(selectOrgRedirectUri).toContain(`scope=`); + expect(selectOrgRedirectUri).toContain(`state=`); + vi.stubGlobal("window", { + location: { + search: new URL(selectOrgRedirectUri, authServerBaseUrl).search, + }, + }); + onTestFinished(() => { + vi.unstubAllGlobals(); + }); + + selectedPostLogin = true; + const continueRes = await serverClient.oauth2.continue( + { + postLogin: true, + }, + { + headers, + throw: true, + onResponse: cookieSetter(headers), + }, + ); + expect(continueRes.url).toContain(redirectUri); + expect(continueRes.url).toContain(`code=`); + + selectedPostLogin = false; + enablePostLogin = false; + }); + it("shall allow user to select an organization/team post login and consent", async ({ onTestFinished, }) => { @@ -1487,6 +1568,7 @@ describe("oauth - prompt", async () => { vi.unstubAllGlobals(); }); + let consentRedirectUri = ""; // Select Account and continue auth flow await serverClient.organization.setActive( { @@ -1495,22 +1577,12 @@ describe("oauth - prompt", async () => { }, { headers, - throw: true, - onResponse: cookieSetter(headers), - }, - ); - const selectedAccountRes = await serverClient.oauth2.continue( - { - postLogin: true, - }, - { - headers, - throw: true, - onResponse: cookieSetter(headers), + onResponse(context) { + consentRedirectUri = context.response.headers.get("Location") || ""; + cookieSetter(headers)(context); + }, }, ); - expect(selectedAccountRes.redirect).toBeTruthy(); - const consentRedirectUri = selectedAccountRes?.url; expect(consentRedirectUri).toContain(`/consent`); expect(consentRedirectUri).toContain(`client_id=${oauthClient.client_id}`); expect(consentRedirectUri).toContain(`scope=`); From a0eb1631fc17c752f3a9dfdb734ff7b85f75fb7a Mon Sep 17 00:00:00 2001 From: Dylan Vanmali Date: Wed, 18 Mar 2026 10:27:19 -0700 Subject: [PATCH 82/88] feat(oauth-provider): public client prelogin endpoint (#8214) --- docs/content/docs/plugins/oauth-provider.mdx | 27 ++++++++++++++++++ .../oauth-provider/src/middleware/index.ts | 17 +++++++++++ packages/oauth-provider/src/oauth.ts | 28 +++++++++---------- .../src/oauthClient/endpoints.test.ts | 25 ++++++++++++++++- .../src/oauthClient/endpoints.ts | 5 ++-- .../oauth-provider/src/oauthClient/index.ts | 28 +++++++++++++++++-- packages/oauth-provider/src/types/index.ts | 5 ++++ packages/oauth-provider/src/utils/index.ts | 16 +++++++++++ 8 files changed, 131 insertions(+), 20 deletions(-) create mode 100644 packages/oauth-provider/src/middleware/index.ts diff --git a/docs/content/docs/plugins/oauth-provider.mdx b/docs/content/docs/plugins/oauth-provider.mdx index 2b0e2b021be..44cd491d98b 100644 --- a/docs/content/docs/plugins/oauth-provider.mdx +++ b/docs/content/docs/plugins/oauth-provider.mdx @@ -195,6 +195,33 @@ type getOAuthClientPublic = { ``` +#### Get Public Client Prelogin + +To obtain a public client prior to login, you must first enable the endpoint in your configuration: + +```ts title="auth.ts" +oauthProvider({ + allowPublicClientPrelogin: true, +}) +``` + +Then, the following endpoint will obtain public client information. + + +```ts +type getOAuthClientPublicPrelogin = { + /** + * The OAuth client's client_id + */ + client_id: string, + /** + * Valid oauth query parameters (Sent automatically when using the provided client) + */ + oauth_query: string +} +``` + + #### List Clients To obtain a list of clients owned by a specific user or organization, use the following endpoint: diff --git a/packages/oauth-provider/src/middleware/index.ts b/packages/oauth-provider/src/middleware/index.ts new file mode 100644 index 00000000000..eb25d596621 --- /dev/null +++ b/packages/oauth-provider/src/middleware/index.ts @@ -0,0 +1,17 @@ +import { APIError, createAuthMiddleware } from "better-auth/api"; +import type { OAuthOptions, Scope } from "../types"; +import { verifyOAuthQueryParams } from "../utils"; + +export const publicSessionMiddleware = (opts: OAuthOptions) => + createAuthMiddleware(async (ctx) => { + if (!opts.allowPublicClientPrelogin) { + throw new APIError("BAD_REQUEST"); + } + const query = ctx.body.oauth_query; + const isValid = await verifyOAuthQueryParams(query, ctx.context.secret); + if (!isValid) { + throw new APIError("UNAUTHORIZED", { + error: "invalid_signature", + }); + } + }); diff --git a/packages/oauth-provider/src/oauth.ts b/packages/oauth-provider/src/oauth.ts index 005b2f9ff61..bb38542539b 100644 --- a/packages/oauth-provider/src/oauth.ts +++ b/packages/oauth-provider/src/oauth.ts @@ -9,7 +9,6 @@ import { sessionMiddleware, } from "better-auth/api"; import { parseSetCookieHeader } from "better-auth/cookies"; -import { constantTimeEqual, makeSignature } from "better-auth/crypto"; import { mergeSchema } from "better-auth/db"; import type { BetterAuthPlugin } from "better-auth/types"; import * as z from "zod"; @@ -28,7 +27,11 @@ import { tokenEndpoint } from "./token"; import type { OAuthOptions, Scope } from "./types"; import { SafeUrlSchema } from "./types/zod"; import { userInfoEndpoint } from "./userinfo"; -import { deleteFromPrompt, getJwtPlugin } from "./utils"; +import { + deleteFromPrompt, + getJwtPlugin, + verifyOAuthQueryParams, +} from "./utils"; declare module "@better-auth/core" { interface BetterAuthPluginRegistry { @@ -209,27 +212,20 @@ export const oauthProvider = >(options: O) => { handler: createAuthMiddleware(async (ctx) => { // Verify query signature const query = ctx.body.oauth_query; - let queryParams = new URLSearchParams(query); - const sig = queryParams.get("sig"); - const exp = Number(queryParams.get("exp")); - queryParams.delete("sig"); - queryParams = new URLSearchParams(queryParams); - const verifySig = await makeSignature( - queryParams.toString(), + const isValid = await verifyOAuthQueryParams( + query, ctx.context.secret, ); - if ( - !sig || - !constantTimeEqual(sig, verifySig) || - new Date(exp * 1000) < new Date() - ) { + if (!isValid) { throw new APIError("BAD_REQUEST", { error: "invalid_signature", }); } + const queryParams = new URLSearchParams(query); + queryParams.delete("sig"); queryParams.delete("exp"); await oAuthState.set({ - query: new URLSearchParams(queryParams).toString(), + query: queryParams.toString(), }); // If path starts oauth2 authorize (ie /sign-in/social, /sign-in/oauth2), add to additional data body @@ -1302,6 +1298,8 @@ export const oauthProvider = >(options: O) => { createOAuthClient: oauthClientEndpoints.createOAuthClient(opts), getOAuthClient: oauthClientEndpoints.getOAuthClient(opts), getOAuthClientPublic: oauthClientEndpoints.getOAuthClientPublic(opts), + getOAuthClientPublicPrelogin: + oauthClientEndpoints.getOAuthClientPublicPrelogin(opts), getOAuthClients: oauthClientEndpoints.getOAuthClients(opts), adminUpdateOAuthClient: oauthClientEndpoints.adminUpdateOAuthClient(opts), updateOAuthClient: oauthClientEndpoints.updateOAuthClient(opts), diff --git a/packages/oauth-provider/src/oauthClient/endpoints.test.ts b/packages/oauth-provider/src/oauthClient/endpoints.test.ts index 02abd452f23..f6af25fccfa 100644 --- a/packages/oauth-provider/src/oauthClient/endpoints.test.ts +++ b/packages/oauth-provider/src/oauthClient/endpoints.test.ts @@ -1,4 +1,5 @@ import { createAuthClient } from "better-auth/client"; +import { makeSignature } from "better-auth/crypto"; import { jwt } from "better-auth/plugins/jwt"; import { getTestInstance } from "better-auth/test"; import { describe, expect, it } from "vitest"; @@ -11,7 +12,7 @@ describe("oauthClient", async () => { const baseUrl = "http://localhost:3000"; const rpBaseUrl = "http://localhost:5000"; const redirectUri = `${rpBaseUrl}/api/auth/oauth2/callback/${providerId}`; - const { signInWithTestUser, customFetchImpl } = await getTestInstance({ + const { auth, signInWithTestUser, customFetchImpl } = await getTestInstance({ baseURL: baseUrl, plugins: [ oauthProvider({ @@ -21,6 +22,7 @@ describe("oauthClient", async () => { oauthAuthServerConfig: true, openidConfig: true, }, + allowPublicClientPrelogin: true, }), jwt(), ], @@ -103,6 +105,27 @@ describe("oauthClient", async () => { }); }); + it("should get public-only information about a client prelogin", async () => { + // Creates mock valid search params + const signedParams = new URLSearchParams({ + exp: `${Math.floor(Date.now() / 1000) + 60}`, + }); + const sig = await makeSignature( + signedParams.toString(), + (auth.options as unknown as { secret: string }).secret, + ); + signedParams.set("sig", sig); + + const client = await authClient.oauth2.publicClientPrelogin({ + client_id: oauthUiClient.client_id, + oauth_query: signedParams.toString(), + }); + expect(client.data).toMatchObject({ + client_id: oauthUiClient.client_id, + ...testUiClientInput, + }); + }); + it("should get user's clients", async () => { const clients = await authClient.oauth2.getClients(); expect(clients?.data?.length).toBe(3); diff --git a/packages/oauth-provider/src/oauthClient/endpoints.ts b/packages/oauth-provider/src/oauthClient/endpoints.ts index 27c3ca2bcb3..c681280e777 100644 --- a/packages/oauth-provider/src/oauthClient/endpoints.ts +++ b/packages/oauth-provider/src/oauthClient/endpoints.ts @@ -53,10 +53,11 @@ export async function getClientEndpoint( * This is commonly used to display information on login flow pages. */ export async function getClientPublicEndpoint( - ctx: GenericEndpointContext & { query: { client_id: string } }, + ctx: GenericEndpointContext, opts: OAuthOptions, + clientId: string, ) { - const client = await getClient(ctx, opts, ctx.query.client_id); + const client = await getClient(ctx, opts, clientId); if (!client) { throw new APIError("NOT_FOUND", { error_description: "client not found", diff --git a/packages/oauth-provider/src/oauthClient/index.ts b/packages/oauth-provider/src/oauthClient/index.ts index 8cbcfb63323..fcfd2c0ea0b 100644 --- a/packages/oauth-provider/src/oauthClient/index.ts +++ b/packages/oauth-provider/src/oauthClient/index.ts @@ -1,5 +1,6 @@ import { createAuthEndpoint, sessionMiddleware } from "better-auth/api"; import * as z from "zod"; +import { publicSessionMiddleware } from "../middleware"; import { createOAuthClientEndpoint } from "../register"; import type { OAuthOptions, Scope } from "../types"; import { SafeUrlSchema } from "../types/zod"; @@ -451,12 +452,35 @@ export const getOAuthClientPublic = (opts: OAuthOptions) => }), metadata: { openapi: { - description: "Gets publically available client fields", + description: "Gets publicly available client fields", }, }, }, async (ctx) => { - return getClientPublicEndpoint(ctx, opts); + const clientId = ctx.query.client_id; + return getClientPublicEndpoint(ctx, opts, clientId); + }, + ); + +export const getOAuthClientPublicPrelogin = (opts: OAuthOptions) => + createAuthEndpoint( + "/oauth2/public-client-prelogin", + { + method: "POST", + use: [publicSessionMiddleware(opts)], + body: z.object({ + client_id: z.string(), + oauth_query: z.string().optional(), + }), + metadata: { + openapi: { + description: "Gets publicly available client fields (prior to login)", + }, + }, + }, + async (ctx) => { + const clientId = ctx.body.client_id; + return getClientPublicEndpoint(ctx, opts, clientId); }, ); diff --git a/packages/oauth-provider/src/types/index.ts b/packages/oauth-provider/src/types/index.ts index 528cd4b6694..3c6e5a7467c 100644 --- a/packages/oauth-provider/src/types/index.ts +++ b/packages/oauth-provider/src/types/index.ts @@ -115,6 +115,11 @@ export interface OAuthOptions< scopeExpirations?: { [K in Scopes[number]]?: number | string | Date; }; + /** + * Allows /oauth2/public-client-prelogin endpoint to be + * requestable prior to login via a valid oauth_query. + */ + allowPublicClientPrelogin?: boolean; /** * Allow unauthenticated dynamic client registration. * diff --git a/packages/oauth-provider/src/utils/index.ts b/packages/oauth-provider/src/utils/index.ts index 0dc5a61e0a5..0311cc05de4 100644 --- a/packages/oauth-provider/src/utils/index.ts +++ b/packages/oauth-provider/src/utils/index.ts @@ -62,6 +62,22 @@ export const getJwtPlugin = (ctx: AuthContext) => { const cachedTrustedClients = new TTLCache>(); +export async function verifyOAuthQueryParams( + oauth_query: string, + secret: string, +) { + const queryParams = new URLSearchParams(oauth_query); + const sig = queryParams.get("sig"); + const exp = Number(queryParams.get("exp")); + queryParams.delete("sig"); + const verifySig = await makeSignature(queryParams.toString(), secret); + return ( + !!sig && + constantTimeEqual(sig, verifySig) && + new Date(exp * 1000) >= new Date() + ); +} + /** * Get a client by ID, checking trusted clients first, then database */ From 9e3e8e6015c5b6020dd6ff28f94778a9b413957e Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Wed, 18 Mar 2026 18:28:33 +0000 Subject: [PATCH 83/88] fix(api): return Response for HTTP request contexts (#7521) --- .../src/api/to-auth-endpoints.test.ts | 13 + .../better-auth/src/api/to-auth-endpoints.ts | 393 +++++++++++------- 2 files changed, 255 insertions(+), 151 deletions(-) diff --git a/packages/better-auth/src/api/to-auth-endpoints.test.ts b/packages/better-auth/src/api/to-auth-endpoints.test.ts index 0ab05cd1eea..48541935183 100644 --- a/packages/better-auth/src/api/to-auth-endpoints.test.ts +++ b/packages/better-auth/src/api/to-auth-endpoints.test.ts @@ -433,6 +433,19 @@ describe("after hook", async () => { expect(result2.headers.get("set-cookie")).toContain("session=value"); expect(result2.headers.get("set-cookie")).toContain("data=2"); }); + + it("should return a Response when invoked with a request context", async () => { + const response = await authEndpoints.cookies({ + request: new Request("http://localhost:3000/cookies", { + method: "POST", + }), + } as any); + expect(response).toBeInstanceOf(Response); + const body = await response.json(); + expect(body).toMatchObject({ hello: "world" }); + expect(response.headers.get("set-cookie")).toContain("session=value"); + expect(response.headers.get("set-cookie")).toContain("data=2"); + }); }); }); diff --git a/packages/better-auth/src/api/to-auth-endpoints.ts b/packages/better-auth/src/api/to-auth-endpoints.ts index 347195fc4cb..5f67049878a 100644 --- a/packages/better-auth/src/api/to-auth-endpoints.ts +++ b/packages/better-auth/src/api/to-auth-endpoints.ts @@ -1,5 +1,5 @@ import type { AuthContext, HookEndpointContext } from "@better-auth/core"; -import type { AuthEndpoint, AuthMiddleware } from "@better-auth/core/api"; +import type { AuthMiddleware } from "@better-auth/core/api"; import { hasRequestState, runWithEndpointContext, @@ -7,9 +7,17 @@ import { } from "@better-auth/core/context"; import { shouldPublishLog } from "@better-auth/core/env"; import { APIError } from "@better-auth/core/error"; +import { + ATTR_CONTEXT, + ATTR_HOOK_TYPE, + ATTR_HTTP_ROUTE, + ATTR_OPERATION_ID, + withSpan, +} from "@better-auth/core/instrumentation"; import type { + Endpoint, EndpointContext, - EndpointOptions, + EndpointRuntimeOptions, InputContext, } from "better-call"; import { kAPIErrorHeaderSymbol, toResponse } from "better-call"; @@ -17,7 +25,20 @@ import { createDefu } from "defu"; import { isAPIError } from "../utils/is-api-error"; type InternalContext = Partial< - InputContext & EndpointContext + InputContext & + EndpointContext< + string, + any, + any, + any, + any, + any, + any, + AuthContext & { + returned?: unknown | undefined; + responseHeaders?: Headers | undefined; + } + > > & { path: string; asResponse?: boolean | undefined; @@ -35,35 +56,59 @@ const defuReplaceArrays = createDefu((obj, key, value) => { } }); +type Hook = { + matcher: (context: HookEndpointContext) => boolean; + handler: AuthMiddleware; +}; + const hooksSourceWeakMap = new WeakMap< AuthMiddleware, `user` | `plugin:${string}` >(); +function getOperationId(endpoint: Endpoint | undefined, key: string): string { + if (!endpoint?.options) return key; + const opts = endpoint.options as { + operationId?: string; + metadata?: { openapi?: { operationId?: string } }; + }; + return opts.operationId ?? opts.metadata?.openapi?.operationId ?? key; +} + type UserInputContext = Partial< - InputContext & EndpointContext + InputContext & + EndpointContext >; -export function toAuthEndpoints< - const E extends Record< - string, - Omit, "wrap"> - >, ->(endpoints: E, ctx: AuthContext | Promise): E { +export function toAuthEndpoints>( + endpoints: E, + ctx: AuthContext | Promise, +): E { const api: Record< string, (( - context: EndpointContext & InputContext, + context: EndpointContext & + InputContext, ) => Promise) & { path?: string | undefined; - options?: EndpointOptions | undefined; + options?: EndpointRuntimeOptions | undefined; } > = {}; for (const [key, endpoint] of Object.entries(endpoints)) { api[key] = async (context?: UserInputContext) => { + const operationId = getOperationId(endpoint, key); + const endpointMethod = endpoint?.options?.method; + const defaultMethod = Array.isArray(endpointMethod) + ? endpointMethod[0] + : endpointMethod; + const run = async () => { const authContext = await ctx; + const methodName = + context?.method ?? context?.request?.method ?? defaultMethod ?? "?"; + const pathName = context?.path ?? endpoint.path ?? "/:virtual"; + let internalContext: InternalContext = { ...context, context: { @@ -75,117 +120,146 @@ export function toAuthEndpoints< path: endpoint.path, headers: context?.headers ? new Headers(context?.headers) : undefined, }; - return runWithEndpointContext(internalContext, async () => { - const { beforeHooks, afterHooks } = getHooks(authContext); - const before = await runBeforeHooks(internalContext, beforeHooks); - /** - * If `before.context` is returned, it should - * get merged with the original context - */ - if ( - "context" in before && - before.context && - typeof before.context === "object" - ) { - const { headers, ...rest } = before.context as { - headers: Headers; - }; - /** - * Headers should be merged differently - * so the hook doesn't override the whole - * header - */ - if (headers) { - headers.forEach((value, key) => { - (internalContext.headers as Headers).set(key, value); - }); - } - internalContext = defuReplaceArrays(rest, internalContext); - } else if (before) { - /* Return before hook response if it's anything other than a context return */ - return context?.asResponse - ? toResponse(before, { - headers: context?.headers, - }) - : context?.returnHeaders - ? { - headers: context?.headers, - response: before, - } - : before; - } - - internalContext.asResponse = false; - internalContext.returnHeaders = true; - internalContext.returnStatus = true; - const result = (await runWithEndpointContext(internalContext, () => - (endpoint as any)(internalContext as any), - ).catch((e: any) => { - if (isAPIError(e)) { + const hasRequest = context?.request instanceof Request; + const shouldReturnResponse = context?.asResponse ?? hasRequest; + return withSpan( + `${methodName} ${pathName}`, + { + [ATTR_HTTP_ROUTE]: pathName, + [ATTR_OPERATION_ID]: operationId, + }, + async () => + runWithEndpointContext(internalContext, async () => { + const { beforeHooks, afterHooks } = getHooks(authContext); + const before = await runBeforeHooks( + internalContext, + beforeHooks, + endpoint, + operationId, + ); /** - * API Errors from response are caught - * and returned to hooks + * If `before.context` is returned, it should + * get merged with the original context */ - return { - response: e, - status: e.statusCode, - headers: e.headers ? new Headers(e.headers) : null, + if ( + "context" in before && + before.context && + typeof before.context === "object" + ) { + const { headers, ...rest } = before.context as { + headers: Headers; + }; + /** + * Headers should be merged differently + * so the hook doesn't override the whole + * header + */ + if (headers) { + headers.forEach((value, key) => { + (internalContext.headers as Headers).set(key, value); + }); + } + internalContext = defuReplaceArrays(rest, internalContext); + } else if (before) { + /* Return before hook response if it's anything other than a context return */ + return shouldReturnResponse + ? toResponse(before, { + headers: context?.headers, + }) + : context?.returnHeaders + ? { + headers: context?.headers, + response: before, + } + : before; + } + + internalContext.asResponse = false; + internalContext.returnHeaders = true; + internalContext.returnStatus = true; + const result = (await runWithEndpointContext( + internalContext, + () => + withSpan( + `handler ${pathName}`, + { + [ATTR_HTTP_ROUTE]: pathName, + [ATTR_OPERATION_ID]: operationId, + }, + () => (endpoint as any)(internalContext as any), + ), + ).catch((e: any) => { + if (isAPIError(e)) { + /** + * API Errors from response are caught + * and returned to hooks + */ + return { + response: e, + status: e.statusCode, + headers: e.headers ? new Headers(e.headers) : null, + }; + } + throw e; + })) as { + headers: Headers; + response: any; + status: number; }; - } - throw e; - })) as { - headers: Headers; - response: any; - status: number; - }; - //if response object is returned we skip after hooks and post processing - if (result && result instanceof Response) { - return result; - } + //if response object is returned we skip after hooks and post processing + if (result && result instanceof Response) { + return result; + } - internalContext.context.returned = result.response; - internalContext.context.responseHeaders = result.headers; + internalContext.context.returned = result.response; + internalContext.context.responseHeaders = result.headers; - const after = await runAfterHooks(internalContext, afterHooks); + const after = await runAfterHooks( + internalContext, + afterHooks, + endpoint, + operationId, + ); - if (after.response) { - result.response = after.response; - } + if (after.response) { + result.response = after.response; + } - if ( - isAPIError(result.response) && - shouldPublishLog(authContext.logger.level, "debug") - ) { - // inherit stack from errorStack if debug mode is enabled - result.response.stack = result.response.errorStack; - } + if ( + isAPIError(result.response) && + shouldPublishLog(authContext.logger.level, "debug") + ) { + // inherit stack from errorStack if debug mode is enabled + result.response.stack = result.response.errorStack; + } - if (isAPIError(result.response) && !context?.asResponse) { - throw result.response; - } + if (isAPIError(result.response) && !shouldReturnResponse) { + throw result.response; + } - const response = context?.asResponse - ? toResponse(result.response, { - headers: result.headers, - status: result.status, - }) - : context?.returnHeaders - ? context?.returnStatus - ? { + const response = shouldReturnResponse + ? toResponse(result.response, { headers: result.headers, - response: result.response, status: result.status, - } - : { - headers: result.headers, - response: result.response, - } - : context?.returnStatus - ? { response: result.response, status: result.status } - : result.response; - return response; - }); + }) + : context?.returnHeaders + ? context?.returnStatus + ? { + headers: result.headers, + response: result.response, + status: result.status, + } + : { + headers: result.headers, + response: result.response, + } + : context?.returnStatus + ? { response: result.response, status: result.status } + : result.response; + return response; + }), + ); }; if (await hasRequestState()) { return run(); @@ -202,10 +276,9 @@ export function toAuthEndpoints< async function runBeforeHooks( context: InternalContext, - hooks: { - matcher: (context: HookEndpointContext) => boolean; - handler: AuthMiddleware; - }[], + hooks: Hook[], + endpoint: Endpoint, + operationId: string, ) { let modifiedContext: Partial = {}; @@ -226,21 +299,31 @@ async function runBeforeHooks( }); } if (matched) { - const result = await hook - .handler({ - ...context, - returnHeaders: false, - }) - .catch((e: unknown) => { - if ( - isAPIError(e) && - shouldPublishLog(context.context.logger.level, "debug") - ) { - // inherit stack from errorStack if debug mode is enabled - e.stack = e.errorStack; - } - throw e; - }); + const hookSource = hooksSourceWeakMap.get(hook.handler) ?? "unknown"; + const path = context.path ?? endpoint?.path ?? "/:virtual"; + const result = await withSpan( + `hook before ${path} ${hookSource}`, + { + [ATTR_HOOK_TYPE]: "before", + [ATTR_HTTP_ROUTE]: path, + [ATTR_CONTEXT]: hookSource, + [ATTR_OPERATION_ID]: operationId, + }, + () => + hook.handler({ + ...context, + returnHeaders: false, + }), + ).catch((e: unknown) => { + if ( + isAPIError(e) && + shouldPublishLog(context.context.logger.level, "debug") + ) { + // inherit stack from errorStack if debug mode is enabled + e.stack = e.errorStack; + } + throw e; + }); if (result && typeof result === "object") { if ("context" in result && typeof result.context === "object") { const { headers, ...rest } = @@ -267,14 +350,24 @@ async function runBeforeHooks( async function runAfterHooks( context: InternalContext, - hooks: { - matcher: (context: HookEndpointContext) => boolean; - handler: AuthMiddleware; - }[], + hooks: Hook[], + endpoint: Endpoint, + operationId: string, ) { for (const hook of hooks) { if (hook.matcher(context)) { - const result = (await hook.handler(context).catch((e) => { + const hookSource = hooksSourceWeakMap.get(hook.handler) ?? "unknown"; + const path = context.path ?? endpoint?.path ?? "/:virtual"; + const result = (await withSpan( + `hook after ${path} ${hookSource}`, + { + [ATTR_HOOK_TYPE]: "after", + [ATTR_HTTP_ROUTE]: path, + [ATTR_CONTEXT]: hookSource, + [ATTR_OPERATION_ID]: operationId, + }, + () => hook.handler(context), + ).catch((e) => { if (isAPIError(e)) { const headers = (e as any)[kAPIErrorHeaderSymbol] as | Headers @@ -325,14 +418,8 @@ async function runAfterHooks( function getHooks(authContext: AuthContext) { const plugins = authContext.options.plugins || []; - const beforeHooks: { - matcher: (context: HookEndpointContext) => boolean; - handler: AuthMiddleware; - }[] = []; - const afterHooks: { - matcher: (context: HookEndpointContext) => boolean; - handler: AuthMiddleware; - }[] = []; + const beforeHooks: Hook[] = []; + const afterHooks: Hook[] = []; const beforeHookHandler = authContext.options.hooks?.before; if (beforeHookHandler) { hooksSourceWeakMap.set(beforeHookHandler, "user"); @@ -349,14 +436,18 @@ function getHooks(authContext: AuthContext) { handler: afterHookHandler, }); } - const pluginBeforeHooks = plugins - .filter((plugin) => plugin.hooks?.before) - .map((plugin) => plugin.hooks?.before!) - .flat(); - const pluginAfterHooks = plugins - .filter((plugin) => plugin.hooks?.after) - .map((plugin) => plugin.hooks?.after!) - .flat(); + const pluginBeforeHooks = plugins.flatMap((plugin) => + (plugin.hooks?.before ?? []).map((h) => { + hooksSourceWeakMap.set(h.handler, `plugin:${plugin.id}`); + return h; + }), + ); + const pluginAfterHooks = plugins.flatMap((plugin) => + (plugin.hooks?.after ?? []).map((h) => { + hooksSourceWeakMap.set(h.handler, `plugin:${plugin.id}`); + return h; + }), + ); /** * Add plugin added hooks at last From fc0bc94a60782fcc0656ee187d8da88d89928d9b Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Thu, 19 Mar 2026 05:32:57 +0900 Subject: [PATCH 84/88] fix(core): prioritize generateId "uuid" over adapter customIdGenerator (#8679) --- .../core/src/db/adapter/get-id-field.test.ts | 222 ++++++++++++++++++ packages/core/src/db/adapter/get-id-field.ts | 19 +- 2 files changed, 237 insertions(+), 4 deletions(-) create mode 100644 packages/core/src/db/adapter/get-id-field.test.ts diff --git a/packages/core/src/db/adapter/get-id-field.test.ts b/packages/core/src/db/adapter/get-id-field.test.ts new file mode 100644 index 00000000000..5a47f714eac --- /dev/null +++ b/packages/core/src/db/adapter/get-id-field.test.ts @@ -0,0 +1,222 @@ +import { describe, expect, it } from "vitest"; +import type { BetterAuthOptions } from "../../types"; +import type { BetterAuthDBSchema } from "../type"; +import { initGetIdField } from "./get-id-field"; + +const minimalSchema: BetterAuthDBSchema = { + user: { + modelName: "user", + fields: { + name: { type: "string" }, + email: { type: "string" }, + }, + }, +}; + +const uuidRegex = + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; + +function getField( + options: BetterAuthOptions, + initExtra?: Partial[0]>, + fieldExtra?: { customModelName?: string; forceAllowId?: boolean }, +) { + const idField = initGetIdField({ + schema: minimalSchema, + options, + ...initExtra, + }); + return idField({ + customModelName: fieldExtra?.customModelName ?? "user", + forceAllowId: fieldExtra?.forceAllowId, + }); +} + +describe("defaultValue priority", () => { + it("should return undefined when disableIdGeneration is true", () => { + const field = getField( + { database: {} as any }, + { disableIdGeneration: true }, + ); + expect(field.defaultValue).toBeUndefined(); + }); + + it("should return undefined when generateId is false", () => { + const value = getField({ + database: {} as any, + advanced: { database: { generateId: false } }, + }).defaultValue?.(); + expect(value).toBeUndefined(); + }); + + it("should return undefined when generateId is 'serial'", () => { + const value = getField({ + database: {} as any, + advanced: { database: { generateId: "serial" } }, + }).defaultValue?.(); + expect(value).toBeUndefined(); + }); + + it("should use generateId function over 'uuid' and customIdGenerator", () => { + const value = getField( + { + database: {} as any, + advanced: { database: { generateId: () => "fn-id" } }, + }, + { customIdGenerator: () => "adapter-id" }, + ).defaultValue?.(); + expect(value).toBe("fn-id"); + }); + + it("should use 'uuid' over customIdGenerator", () => { + const value = getField( + { + database: {} as any, + advanced: { database: { generateId: "uuid" } }, + }, + { customIdGenerator: () => "adapter-id", supportsUUIDs: false }, + ).defaultValue?.(); + expect(value).toMatch(uuidRegex); + }); + + it("should use customIdGenerator when generateId is not set", () => { + const value = getField( + { database: {} as any }, + { customIdGenerator: () => "adapter-id" }, + ).defaultValue?.(); + expect(value).toBe("adapter-id"); + }); + + it("should fall back to default id generation", () => { + const value = getField({ database: {} as any }).defaultValue?.(); + expect(typeof value).toBe("string"); + expect(value).not.toMatch(uuidRegex); + }); +}); + +describe("type and required", () => { + it("should have type 'number' when generateId is 'serial'", () => { + const field = getField({ + database: {} as any, + advanced: { database: { generateId: "serial" } }, + }); + expect(field.type).toBe("number"); + expect(field.required).toBe(false); + }); + + it("should have type 'string' by default", () => { + const field = getField({ database: {} as any }); + expect(field.type).toBe("string"); + expect(field.required).toBe(true); + }); + + it("should not generate id when useUUIDs and supportsUUIDs", () => { + const field = getField( + { + database: {} as any, + advanced: { database: { generateId: "uuid" } }, + }, + { supportsUUIDs: true }, + ); + expect(field.required).toBe(false); + expect(field.defaultValue).toBeUndefined(); + }); +}); + +describe("transform.input", () => { + it("should return undefined for falsy value", () => { + const field = getField({ database: {} as any }); + expect(field.transform.input(undefined)).toBeUndefined(); + expect(field.transform.input(null)).toBeUndefined(); + expect(field.transform.input("")).toBeUndefined(); + }); + + it("should return value as-is by default", () => { + const field = getField({ database: {} as any }); + expect(field.transform.input("some-id")).toBe("some-id"); + }); + + describe("serial", () => { + it("should convert string to number", () => { + const field = getField({ + database: {} as any, + advanced: { database: { generateId: "serial" } }, + }); + expect(field.transform.input("42")).toBe(42); + }); + + it("should return undefined for non-numeric string", () => { + const field = getField({ + database: {} as any, + advanced: { database: { generateId: "serial" } }, + }); + expect(field.transform.input("not-a-number")).toBeUndefined(); + }); + }); + + describe("uuid", () => { + it("should return value as-is when shouldGenerateId and not forceAllowId", () => { + const field = getField( + { + database: {} as any, + advanced: { database: { generateId: "uuid" } }, + }, + { supportsUUIDs: false }, + ); + const uuid = crypto.randomUUID(); + expect(field.transform.input(uuid)).toBe(uuid); + }); + + it("should return undefined when supportsUUIDs (DB handles it)", () => { + const field = getField( + { + database: {} as any, + advanced: { database: { generateId: "uuid" } }, + }, + { supportsUUIDs: true }, + ); + expect(field.transform.input("some-value")).toBeUndefined(); + }); + + it("should accept valid UUID when forceAllowId is true", () => { + const uuid = crypto.randomUUID(); + const field = getField( + { + database: {} as any, + advanced: { database: { generateId: "uuid" } }, + }, + { supportsUUIDs: false }, + { forceAllowId: true }, + ); + expect(field.transform.input(uuid)).toBe(uuid); + }); + + it("should generate new UUID for non-string value when DB doesn't support UUIDs", () => { + const field = getField( + { + database: {} as any, + advanced: { database: { generateId: "uuid" } }, + }, + { supportsUUIDs: false }, + { forceAllowId: true }, + ); + const result = field.transform.input(123); + expect(result).toMatch(uuidRegex); + }); + }); +}); + +describe("transform.output", () => { + it("should return undefined for falsy value", () => { + const field = getField({ database: {} as any }); + expect(field.transform.output(undefined)).toBeUndefined(); + expect(field.transform.output(null)).toBeUndefined(); + expect(field.transform.output("")).toBeUndefined(); + }); + + it("should convert value to string", () => { + const field = getField({ database: {} as any }); + expect(field.transform.output(123)).toBe("123"); + expect(field.transform.output("abc")).toBe("abc"); + }); +}); diff --git a/packages/core/src/db/adapter/get-id-field.ts b/packages/core/src/db/adapter/get-id-field.ts index 5b3e9b192c6..c4f76a5d2c0 100644 --- a/packages/core/src/db/adapter/get-id-field.ts +++ b/packages/core/src/db/adapter/get-id-field.ts @@ -57,18 +57,29 @@ export const initGetIdField = ({ defaultValue() { if (disableIdGeneration) return undefined; const generateId = options.advanced?.database?.generateId; - if (generateId === false || useNumberId) return undefined; + + // let the database handle id generation + if (generateId === false || generateId === "serial") + return undefined; + + // user-provided function takes highest priority if (typeof generateId === "function") { return generateId({ model, }); } - if (customIdGenerator) { - return customIdGenerator({ model }); - } + + // user-provided "uuid" option if (generateId === "uuid") { return crypto.randomUUID(); } + + // database adapter-level custom id generator + if (customIdGenerator) { + return customIdGenerator({ model }); + } + + // fallback to default id generation return defaultGenerateId(); }, } From d1bfff1d6204b95892b1be00ab05e65599682e2f Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Thu, 19 Mar 2026 05:54:59 +0900 Subject: [PATCH 85/88] feat(mongo-adapter): store UUIDs as native BSON UUID (#8681) --- .../mongo-adapter/adapter.mongo-db.test.ts | 3 +- .../mongo-adapter/src/mongodb-adapter.test.ts | 140 ++++++++++++++++++ packages/mongo-adapter/src/mongodb-adapter.ts | 40 +++-- 3 files changed, 170 insertions(+), 13 deletions(-) diff --git a/e2e/adapter/test/mongo-adapter/adapter.mongo-db.test.ts b/e2e/adapter/test/mongo-adapter/adapter.mongo-db.test.ts index 04e8cc3c6fb..63dc4cc053d 100644 --- a/e2e/adapter/test/mongo-adapter/adapter.mongo-db.test.ts +++ b/e2e/adapter/test/mongo-adapter/adapter.mongo-db.test.ts @@ -8,6 +8,7 @@ import { joinsTestSuite, normalTestSuite, transactionsTestSuite, + uuidTestSuite, } from "../adapter-factory"; const dbClient = async (connectionString: string, dbName: string) => { @@ -83,8 +84,8 @@ const { execute } = await testAdapter({ transactionsTestSuite(), joinsTestSuite(), updateObjectIdTestSuite(), + uuidTestSuite(), // numberIdTestSuite(), // no support - // uuidTestSuite() // no support ], customIdGenerator: () => new ObjectId().toHexString(), }); diff --git a/packages/mongo-adapter/src/mongodb-adapter.test.ts b/packages/mongo-adapter/src/mongodb-adapter.test.ts index 96505229af6..1de804824a4 100644 --- a/packages/mongo-adapter/src/mongodb-adapter.test.ts +++ b/packages/mongo-adapter/src/mongodb-adapter.test.ts @@ -1,3 +1,4 @@ +import { ObjectId, UUID } from "mongodb"; import { describe, expect, it, vi } from "vitest"; import { mongodbAdapter } from "./mongodb-adapter"; @@ -10,3 +11,142 @@ describe("mongodb-adapter", () => { expect(adapter).toBeDefined(); }); }); + +describe("uuid support", () => { + const uuidRegex = + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; + const uuid = "550e8400-e29b-41d4-a716-446655440000"; + + function createMockDb() { + const insertedDocs: any[] = []; + const updatedFilters: any[] = []; + const updatedValues: any[] = []; + + const collection = vi.fn(() => ({ + insertOne: vi.fn(async (doc: any) => { + insertedDocs.push(doc); + return { insertedId: doc._id }; + }), + aggregate: vi.fn(() => ({ + toArray: vi.fn(async () => { + return []; + }), + })), + findOneAndUpdate: vi.fn(async (filter: any, update: any) => { + updatedFilters.push(filter); + updatedValues.push(update); + return { value: { ...update.$set, _id: filter._id } }; + }), + deleteOne: vi.fn(async () => {}), + })); + + return { + db: { collection } as any, + insertedDocs, + updatedFilters, + updatedValues, + }; + } + + function createAdapter( + db: any, + generateId: "uuid" | (() => string) | undefined, + ) { + const adapterFactory = mongodbAdapter(db, { transaction: false }); + return adapterFactory({ + database: {} as any, + advanced: { + database: { + ...(generateId !== undefined ? { generateId } : {}), + }, + }, + } as any); + } + + it("should store _id as BSON UUID when generateId is 'uuid'", async () => { + const { db, insertedDocs } = createMockDb(); + const adapter = createAdapter(db, "uuid"); + + await adapter.create({ + model: "user", + data: { + name: "Test", + email: "test@test.com", + emailVerified: true, + createdAt: new Date(), + updatedAt: new Date(), + }, + }); + + expect(insertedDocs.length).toBe(1); + expect(insertedDocs[0]._id).toBeInstanceOf(UUID); + expect(insertedDocs[0]._id.toString()).toMatch(uuidRegex); + }); + + it("should store FK fields as BSON UUID when generateId is 'uuid'", async () => { + const { db, insertedDocs } = createMockDb(); + const adapter = createAdapter(db, "uuid"); + + await adapter.create({ + model: "session", + data: { + userId: uuid, + token: "test-token", + expiresAt: new Date(), + createdAt: new Date(), + updatedAt: new Date(), + }, + }); + + expect(insertedDocs.length).toBe(1); + expect(insertedDocs[0]._id).toBeInstanceOf(UUID); + expect(insertedDocs[0].userId).toBeInstanceOf(UUID); + expect(insertedDocs[0].userId.toString()).toBe(uuid); + }); + + it("should store _id as ObjectId when generateId is not set", async () => { + const { db, insertedDocs } = createMockDb(); + const adapter = createAdapter(db, undefined); + + await adapter.create({ + model: "user", + data: { + name: "Test", + email: "test@test.com", + emailVerified: true, + createdAt: new Date(), + updatedAt: new Date(), + }, + }); + + expect(insertedDocs.length).toBe(1); + expect(insertedDocs[0]._id).toBeInstanceOf(ObjectId); + }); + + it("should convert BSON UUID to string in output", async () => { + const bsonUuid = new UUID(uuid); + const { db } = createMockDb(); + + // Override aggregate to return a document with BSON UUID + (db.collection as any).mockReturnValue({ + aggregate: vi.fn(() => ({ + toArray: vi.fn(async () => [ + { + _id: bsonUuid, + name: "Test", + email: "test@test.com", + }, + ]), + })), + }); + + const adapter = createAdapter(db, "uuid"); + const result = await adapter.findOne({ + model: "user", + where: [{ field: "id", value: uuid }], + }); + + expect(result).not.toBeNull(); + expect((result as Record).id).toBe(uuid); + }); +}); diff --git a/packages/mongo-adapter/src/mongodb-adapter.ts b/packages/mongo-adapter/src/mongodb-adapter.ts index 0fcc95962f8..18cf00ae63e 100644 --- a/packages/mongo-adapter/src/mongodb-adapter.ts +++ b/packages/mongo-adapter/src/mongodb-adapter.ts @@ -8,7 +8,7 @@ import type { } from "@better-auth/core/db/adapter"; import { createAdapterFactory } from "@better-auth/core/db/adapter"; import type { ClientSession, Db, MongoClient } from "mongodb"; -import { ObjectId } from "mongodb"; +import { ObjectId, UUID } from "mongodb"; class MongoAdapterError extends Error { constructor( @@ -77,6 +77,17 @@ export const mongodbAdapter = ( options, }) => { const customIdGen = getCustomIdGenerator(options); + const useUUIDs = options.advanced?.database?.generateId === "uuid"; + + function coerceToIdType(value: string): ObjectId | UUID { + if (useUUIDs) return new UUID(value); + return new ObjectId(value); + } + + function isIdInstance(value: unknown): value is ObjectId | UUID { + if (useUUIDs) return value instanceof UUID; + return value instanceof ObjectId; + } function serializeID({ field, @@ -100,7 +111,7 @@ export const mongodbAdapter = ( return value; } if (typeof value !== "string") { - if (value instanceof ObjectId) { + if (isIdInstance(value)) { return value; } if (Array.isArray(value)) { @@ -110,12 +121,12 @@ export const mongodbAdapter = ( } if (typeof v === "string") { try { - return new ObjectId(v); + return coerceToIdType(v); } catch { return v; } } - if (v instanceof ObjectId) { + if (isIdInstance(v)) { return v; } throw new MongoAdapterError("INVALID_ID", "Invalid id value"); @@ -124,7 +135,7 @@ export const mongodbAdapter = ( throw new MongoAdapterError("INVALID_ID", "Invalid id value"); } try { - return new ObjectId(value); + return coerceToIdType(value); } catch { return value; } @@ -635,15 +646,16 @@ export const mongodbAdapter = ( if (action !== "create" && action !== "update") { return data; } - if (data instanceof ObjectId) { + const IdClass = + options.advanced?.database?.generateId === "uuid" ? UUID : ObjectId; + if (data instanceof IdClass) { return data; } if (Array.isArray(data)) { return data.map((v) => { if (typeof v === "string") { try { - const oid = new ObjectId(v); - return oid; + return new IdClass(v); } catch { return v; } @@ -653,8 +665,7 @@ export const mongodbAdapter = ( } if (typeof data === "string") { try { - const oid = new ObjectId(data); - return oid; + return new IdClass(data); } catch { return data; } @@ -669,18 +680,23 @@ export const mongodbAdapter = ( if (action === "update") { return data; } - const oid = new ObjectId(); - return oid; + return new IdClass(); } return data; }, customTransformOutput({ data, field, fieldAttributes }) { if (field === "id" || fieldAttributes.references?.field === "id") { + if (data instanceof UUID) { + return data.toString(); + } if (data instanceof ObjectId) { return data.toHexString(); } if (Array.isArray(data)) { return data.map((v) => { + if (v instanceof UUID) { + return v.toString(); + } if (v instanceof ObjectId) { return v.toHexString(); } From 1a4ddce6579b61b088a0af1da36b92006b48bf07 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Wed, 18 Mar 2026 15:11:23 -0700 Subject: [PATCH 86/88] chore(deps): bump next.js from 16.1.6 to 16.2.0 (#8682) --- demo/nextjs/package.json | 2 +- demo/nextjs/pnpm-lock.yaml | 94 +++++++-------- demo/stateless/package.json | 2 +- demo/stateless/pnpm-lock.yaml | 82 ++++++------- docs/package.json | 2 +- landing/package.json | 2 +- packages/better-auth/package.json | 2 +- pnpm-lock.yaml | 194 +++++++++++++++--------------- 8 files changed, 190 insertions(+), 190 deletions(-) diff --git a/demo/nextjs/package.json b/demo/nextjs/package.json index caf8870e8e8..40b289bfbb4 100644 --- a/demo/nextjs/package.json +++ b/demo/nextjs/package.json @@ -70,7 +70,7 @@ "lucide-react": "^0.575.0", "mcp-handler": "^1.0.7", "mysql2": "^3.18.2", - "next": "16.1.6", + "next": "16.2.0", "next-themes": "^0.4.6", "react": "^19.2.4", "react-day-picker": "9.14.0", diff --git a/demo/nextjs/pnpm-lock.yaml b/demo/nextjs/pnpm-lock.yaml index 437d1bc3707..77b6b6ce48e 100644 --- a/demo/nextjs/pnpm-lock.yaml +++ b/demo/nextjs/pnpm-lock.yaml @@ -163,7 +163,7 @@ importers: version: 12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) geist: specifier: ^1.7.0 - version: 1.7.0(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 1.7.0(next@16.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) input-otp: specifier: ^1.4.2 version: 1.4.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -175,13 +175,13 @@ importers: version: 0.575.0(react@19.2.4) mcp-handler: specifier: ^1.0.7 - version: 1.0.7(@modelcontextprotocol/sdk@1.27.1(zod@4.3.6))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 1.0.7(@modelcontextprotocol/sdk@1.27.1(zod@4.3.6))(next@16.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) mysql2: specifier: ^3.18.2 version: 3.18.2(@types/node@25.3.3) next: - specifier: 16.1.6 - version: 16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 16.2.0 + version: 16.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -575,57 +575,57 @@ packages: '@neon-rs/load@0.0.4': resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} - '@next/env@16.1.6': - resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==} + '@next/env@16.2.0': + resolution: {integrity: sha512-OZIbODWWAi0epQRCRjNe1VO45LOFBzgiyqmTLzIqWq6u1wrxKnAyz1HH6tgY/Mc81YzIjRPoYsPAEr4QV4l9TA==} - '@next/swc-darwin-arm64@16.1.6': - resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} + '@next/swc-darwin-arm64@16.2.0': + resolution: {integrity: sha512-/JZsqKzKt01IFoiLLAzlNqys7qk2F3JkcUhj50zuRhKDQkZNOz9E5N6wAQWprXdsvjRP4lTFj+/+36NSv5AwhQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.1.6': - resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} + '@next/swc-darwin-x64@16.2.0': + resolution: {integrity: sha512-/hV8erWq4SNlVgglUiW5UmQ5Hwy5EW/AbbXlJCn6zkfKxTy/E/U3V8U1Ocm2YCTUoFgQdoMxRyRMOW5jYy4ygg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.1.6': - resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} + '@next/swc-linux-arm64-gnu@16.2.0': + resolution: {integrity: sha512-GkjL/Q7MWOwqWR9zoxu1TIHzkOI2l2BHCf7FzeQG87zPgs+6WDh+oC9Sw9ARuuL/FUk6JNCgKRkA6rEQYadUaw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@16.1.6': - resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} + '@next/swc-linux-arm64-musl@16.2.0': + resolution: {integrity: sha512-1ffhC6KY5qWLg5miMlKJp3dZbXelEfjuXt1qcp5WzSCQy36CV3y+JT7OC1WSFKizGQCDOcQbfkH/IjZP3cdRNA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@16.1.6': - resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} + '@next/swc-linux-x64-gnu@16.2.0': + resolution: {integrity: sha512-FmbDcZQ8yJRq93EJSL6xaE0KK/Rslraf8fj1uViGxg7K4CKBCRYSubILJPEhjSgZurpcPQq12QNOJQ0DRJl6Hg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@16.1.6': - resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} + '@next/swc-linux-x64-musl@16.2.0': + resolution: {integrity: sha512-HzjIHVkmGAwRbh/vzvoBWWEbb8BBZPxBvVbDQDvzHSf3D8RP/4vjw7MNLDXFF9Q1WEzeQyEj2zdxBtVAHu5Oyw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@16.1.6': - resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} + '@next/swc-win32-arm64-msvc@16.2.0': + resolution: {integrity: sha512-UMiFNQf5H7+1ZsZPxEsA064WEuFbRNq/kEXyepbCnSErp4f5iut75dBA8UeerFIG3vDaQNOfCpevnERPp2V+nA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.1.6': - resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} + '@next/swc-win32-x64-msvc@16.2.0': + resolution: {integrity: sha512-DRrNJKW+/eimrZgdhVN1uvkN1OI4j6Lpefwr44jKQ0YQzztlmOBUUzHuV5GxOMPK3nmodAYElUVCY8ZXo/IWeA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2347,8 +2347,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.1.6: - resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} + next@16.2.0: + resolution: {integrity: sha512-NLBVrJy1pbV1Yn00L5sU4vFyAHt5XuSjzrNyFnxo6Com0M0KrL6hHM5B99dbqXb2bE9pm4Ow3Zl1xp6HVY9edQ==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -3142,30 +3142,30 @@ snapshots: '@neon-rs/load@0.0.4': {} - '@next/env@16.1.6': {} + '@next/env@16.2.0': {} - '@next/swc-darwin-arm64@16.1.6': + '@next/swc-darwin-arm64@16.2.0': optional: true - '@next/swc-darwin-x64@16.1.6': + '@next/swc-darwin-x64@16.2.0': optional: true - '@next/swc-linux-arm64-gnu@16.1.6': + '@next/swc-linux-arm64-gnu@16.2.0': optional: true - '@next/swc-linux-arm64-musl@16.1.6': + '@next/swc-linux-arm64-musl@16.2.0': optional: true - '@next/swc-linux-x64-gnu@16.1.6': + '@next/swc-linux-x64-gnu@16.2.0': optional: true - '@next/swc-linux-x64-musl@16.1.6': + '@next/swc-linux-x64-musl@16.2.0': optional: true - '@next/swc-win32-arm64-msvc@16.1.6': + '@next/swc-win32-arm64-msvc@16.2.0': optional: true - '@next/swc-win32-x64-msvc@16.1.6': + '@next/swc-win32-x64-msvc@16.2.0': optional: true '@number-flow/react@0.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': @@ -4536,9 +4536,9 @@ snapshots: function-bind@1.1.2: {} - geist@1.7.0(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): + geist@1.7.0(next@16.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): dependencies: - next: 16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + next: 16.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) generate-function@2.3.1: dependencies: @@ -4732,14 +4732,14 @@ snapshots: math-intrinsics@1.1.0: {} - mcp-handler@1.0.7(@modelcontextprotocol/sdk@1.27.1(zod@4.3.6))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): + mcp-handler@1.0.7(@modelcontextprotocol/sdk@1.27.1(zod@4.3.6))(next@16.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): dependencies: '@modelcontextprotocol/sdk': 1.27.1(zod@4.3.6) chalk: 5.6.2 commander: 11.1.0 redis: 4.7.1 optionalDependencies: - next: 16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + next: 16.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) media-typer@1.1.0: {} @@ -4786,9 +4786,9 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next@16.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@next/env': 16.1.6 + '@next/env': 16.2.0 '@swc/helpers': 0.5.15 baseline-browser-mapping: 2.10.0 caniuse-lite: 1.0.30001775 @@ -4797,14 +4797,14 @@ snapshots: react-dom: 19.2.4(react@19.2.4) styled-jsx: 5.1.6(react@19.2.4) optionalDependencies: - '@next/swc-darwin-arm64': 16.1.6 - '@next/swc-darwin-x64': 16.1.6 - '@next/swc-linux-arm64-gnu': 16.1.6 - '@next/swc-linux-arm64-musl': 16.1.6 - '@next/swc-linux-x64-gnu': 16.1.6 - '@next/swc-linux-x64-musl': 16.1.6 - '@next/swc-win32-arm64-msvc': 16.1.6 - '@next/swc-win32-x64-msvc': 16.1.6 + '@next/swc-darwin-arm64': 16.2.0 + '@next/swc-darwin-x64': 16.2.0 + '@next/swc-linux-arm64-gnu': 16.2.0 + '@next/swc-linux-arm64-musl': 16.2.0 + '@next/swc-linux-x64-gnu': 16.2.0 + '@next/swc-linux-x64-musl': 16.2.0 + '@next/swc-win32-arm64-msvc': 16.2.0 + '@next/swc-win32-x64-msvc': 16.2.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' diff --git a/demo/stateless/package.json b/demo/stateless/package.json index 5dadc00afa7..6a08d800ef9 100644 --- a/demo/stateless/package.json +++ b/demo/stateless/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "better-auth": "link:../../packages/better-auth", - "next": "16.1.6", + "next": "16.2.0", "react": "^19.2.4", "react-dom": "^19.2.4" }, diff --git a/demo/stateless/pnpm-lock.yaml b/demo/stateless/pnpm-lock.yaml index d0b630bb3c4..ce201a2ec3b 100644 --- a/demo/stateless/pnpm-lock.yaml +++ b/demo/stateless/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: link:../../packages/better-auth version: link:../../packages/better-auth next: - specifier: 16.1.6 - version: 16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 16.2.0 + version: 16.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: specifier: ^19.2.4 version: 19.2.4 @@ -218,57 +218,57 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@next/env@16.1.6': - resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==} + '@next/env@16.2.0': + resolution: {integrity: sha512-OZIbODWWAi0epQRCRjNe1VO45LOFBzgiyqmTLzIqWq6u1wrxKnAyz1HH6tgY/Mc81YzIjRPoYsPAEr4QV4l9TA==} - '@next/swc-darwin-arm64@16.1.6': - resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} + '@next/swc-darwin-arm64@16.2.0': + resolution: {integrity: sha512-/JZsqKzKt01IFoiLLAzlNqys7qk2F3JkcUhj50zuRhKDQkZNOz9E5N6wAQWprXdsvjRP4lTFj+/+36NSv5AwhQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.1.6': - resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} + '@next/swc-darwin-x64@16.2.0': + resolution: {integrity: sha512-/hV8erWq4SNlVgglUiW5UmQ5Hwy5EW/AbbXlJCn6zkfKxTy/E/U3V8U1Ocm2YCTUoFgQdoMxRyRMOW5jYy4ygg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.1.6': - resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} + '@next/swc-linux-arm64-gnu@16.2.0': + resolution: {integrity: sha512-GkjL/Q7MWOwqWR9zoxu1TIHzkOI2l2BHCf7FzeQG87zPgs+6WDh+oC9Sw9ARuuL/FUk6JNCgKRkA6rEQYadUaw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@16.1.6': - resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} + '@next/swc-linux-arm64-musl@16.2.0': + resolution: {integrity: sha512-1ffhC6KY5qWLg5miMlKJp3dZbXelEfjuXt1qcp5WzSCQy36CV3y+JT7OC1WSFKizGQCDOcQbfkH/IjZP3cdRNA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@16.1.6': - resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} + '@next/swc-linux-x64-gnu@16.2.0': + resolution: {integrity: sha512-FmbDcZQ8yJRq93EJSL6xaE0KK/Rslraf8fj1uViGxg7K4CKBCRYSubILJPEhjSgZurpcPQq12QNOJQ0DRJl6Hg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@16.1.6': - resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} + '@next/swc-linux-x64-musl@16.2.0': + resolution: {integrity: sha512-HzjIHVkmGAwRbh/vzvoBWWEbb8BBZPxBvVbDQDvzHSf3D8RP/4vjw7MNLDXFF9Q1WEzeQyEj2zdxBtVAHu5Oyw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@16.1.6': - resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} + '@next/swc-win32-arm64-msvc@16.2.0': + resolution: {integrity: sha512-UMiFNQf5H7+1ZsZPxEsA064WEuFbRNq/kEXyepbCnSErp4f5iut75dBA8UeerFIG3vDaQNOfCpevnERPp2V+nA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.1.6': - resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} + '@next/swc-win32-x64-msvc@16.2.0': + resolution: {integrity: sha512-DRrNJKW+/eimrZgdhVN1uvkN1OI4j6Lpefwr44jKQ0YQzztlmOBUUzHuV5GxOMPK3nmodAYElUVCY8ZXo/IWeA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -487,8 +487,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - next@16.1.6: - resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} + next@16.2.0: + resolution: {integrity: sha512-NLBVrJy1pbV1Yn00L5sU4vFyAHt5XuSjzrNyFnxo6Com0M0KrL6hHM5B99dbqXb2bE9pm4Ow3Zl1xp6HVY9edQ==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -697,30 +697,30 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@next/env@16.1.6': {} + '@next/env@16.2.0': {} - '@next/swc-darwin-arm64@16.1.6': + '@next/swc-darwin-arm64@16.2.0': optional: true - '@next/swc-darwin-x64@16.1.6': + '@next/swc-darwin-x64@16.2.0': optional: true - '@next/swc-linux-arm64-gnu@16.1.6': + '@next/swc-linux-arm64-gnu@16.2.0': optional: true - '@next/swc-linux-arm64-musl@16.1.6': + '@next/swc-linux-arm64-musl@16.2.0': optional: true - '@next/swc-linux-x64-gnu@16.1.6': + '@next/swc-linux-x64-gnu@16.2.0': optional: true - '@next/swc-linux-x64-musl@16.1.6': + '@next/swc-linux-x64-musl@16.2.0': optional: true - '@next/swc-win32-arm64-msvc@16.1.6': + '@next/swc-win32-arm64-msvc@16.2.0': optional: true - '@next/swc-win32-x64-msvc@16.1.6': + '@next/swc-win32-x64-msvc@16.2.0': optional: true '@swc/helpers@0.5.15': @@ -878,9 +878,9 @@ snapshots: nanoid@3.3.11: {} - next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next@16.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@next/env': 16.1.6 + '@next/env': 16.2.0 '@swc/helpers': 0.5.15 baseline-browser-mapping: 2.10.0 caniuse-lite: 1.0.30001775 @@ -889,14 +889,14 @@ snapshots: react-dom: 19.2.4(react@19.2.4) styled-jsx: 5.1.6(react@19.2.4) optionalDependencies: - '@next/swc-darwin-arm64': 16.1.6 - '@next/swc-darwin-x64': 16.1.6 - '@next/swc-linux-arm64-gnu': 16.1.6 - '@next/swc-linux-arm64-musl': 16.1.6 - '@next/swc-linux-x64-gnu': 16.1.6 - '@next/swc-linux-x64-musl': 16.1.6 - '@next/swc-win32-arm64-msvc': 16.1.6 - '@next/swc-win32-x64-msvc': 16.1.6 + '@next/swc-darwin-arm64': 16.2.0 + '@next/swc-darwin-x64': 16.2.0 + '@next/swc-linux-arm64-gnu': 16.2.0 + '@next/swc-linux-arm64-musl': 16.2.0 + '@next/swc-linux-x64-gnu': 16.2.0 + '@next/swc-linux-x64-musl': 16.2.0 + '@next/swc-win32-arm64-msvc': 16.2.0 + '@next/swc-win32-x64-msvc': 16.2.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' diff --git a/docs/package.json b/docs/package.json index ee67b916981..f9ae96913f1 100644 --- a/docs/package.json +++ b/docs/package.json @@ -66,7 +66,7 @@ "lucide-react": "^0.563.0", "mermaid": "^11.12.3", "motion": "^12.34.0", - "next": "16.1.6", + "next": "16.2.0", "next-themes": "^0.4.6", "prism-react-renderer": "^2.4.1", "react": "catalog:react19", diff --git a/landing/package.json b/landing/package.json index fd1207b0c53..a7b5bd85b78 100644 --- a/landing/package.json +++ b/landing/package.json @@ -58,7 +58,7 @@ "js-beautify": "^1.15.4", "lucide-react": "^0.575.0", "motion": "^12.23.12", - "next": "16.1.6", + "next": "16.2.0", "next-themes": "^0.4.6", "radix-ui": "^1.4.3", "react": "^19.1.0", diff --git a/packages/better-auth/package.json b/packages/better-auth/package.json index c5b4b7645b0..5b986eb53c2 100644 --- a/packages/better-auth/package.json +++ b/packages/better-auth/package.json @@ -521,7 +521,7 @@ "happy-dom": "^20.7.0", "listhen": "^1.9.0", "msw": "^2.12.10", - "next": "^16.1.6", + "next": "^16.2.0", "oauth2-mock-server": "^8.2.2", "react": "catalog:react19", "react-dom": "catalog:react19", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1afd349aeea..1eb93429ca5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -217,13 +217,13 @@ importers: version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@scalar/nextjs-api-reference': specifier: ^0.9.14 - version: 0.9.24(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4) + version: 0.9.24(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4) '@tanstack/react-table': specifier: ^8.21.3 version: 8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@vercel/analytics': specifier: ^1.6.1 - version: 1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) + version: 1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) '@vercel/og': specifier: ^0.8.6 version: 0.8.6 @@ -259,19 +259,19 @@ importers: version: 12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) fumadocs-core: specifier: 16.5.2 - version: 16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + version: 16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) fumadocs-mdx: specifier: 14.2.7 - version: 14.2.7(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 14.2.7(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) fumadocs-typescript: specifier: ^5.1.2 - version: 5.1.4(f245ce4745497b47498caec764b8c0fe) + version: 5.1.4(9b4153ee01e9e4517d024462946a1b90) fumadocs-ui: specifier: 16.5.2 - version: 16.5.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) + version: 16.5.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) geist: specifier: ^1.5.1 - version: 1.7.0(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)) + version: 1.7.0(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)) gray-matter: specifier: ^4.0.3 version: 4.0.3 @@ -306,8 +306,8 @@ importers: specifier: ^12.34.0 version: 12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next: - specifier: 16.1.6 - version: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + specifier: 16.2.0 + version: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -661,7 +661,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: ^0.12.18 - version: 0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))) + version: 0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))) '@cloudflare/workers-types': specifier: ^4.20260226.1 version: 4.20260226.1 @@ -834,7 +834,7 @@ importers: version: 1.36.4 '@vercel/analytics': specifier: ^1.6.1 - version: 1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) + version: 1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) '@vercel/og': specifier: ^0.10.1 version: 0.10.1 @@ -861,19 +861,19 @@ importers: version: 12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) fumadocs-core: specifier: 16.6.7 - version: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + version: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) fumadocs-mdx: specifier: ^14.2.8 - version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) fumadocs-typescript: specifier: ^5.1.4 - version: 5.1.4(3749dc07ba6aad1af5ecb0ad432fe651) + version: 5.1.4(6f1717d56d58a3cff48f6e7a0874b43c) fumadocs-ui: specifier: 16.6.7 - version: 16.6.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) + version: 16.6.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) geist: specifier: ^1.7.0 - version: 1.7.0(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)) + version: 1.7.0(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)) hast-util-to-jsx-runtime: specifier: ^2.3.6 version: 2.3.6 @@ -887,8 +887,8 @@ importers: specifier: ^12.23.12 version: 12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next: - specifier: 16.1.6 - version: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + specifier: 16.2.0 + version: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -945,7 +945,7 @@ importers: version: 3.0.2(@babel/runtime@7.29.2) typesense-fumadocs-adapter: specifier: ^0.3.0 - version: 0.3.0(40151152e36b86667babdaa0510dec49) + version: 0.3.0(588ddc5beb77b81f1d770f6df2e4097f) unist-util-visit: specifier: ^5.1.0 version: 5.1.0 @@ -1136,8 +1136,8 @@ importers: specifier: ^2.12.10 version: 2.12.10(@types/node@25.5.0)(typescript@5.9.3) next: - specifier: ^16.1.6 - version: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + specifier: ^16.2.0 + version: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) oauth2-mock-server: specifier: ^8.2.2 version: 8.2.2 @@ -4465,57 +4465,57 @@ packages: resolution: {integrity: sha512-dyJeuggzQM8+Dsi0T8Z9UjfLJ6vCmNC36W6WE2aqzfTdTw4wPkh2xlEu4LoD75+TGuYK7jIhEoU2QcCXOzfyAQ==} engines: {node: ^18.14.0 || >=20} - '@next/env@16.1.6': - resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==} + '@next/env@16.2.0': + resolution: {integrity: sha512-OZIbODWWAi0epQRCRjNe1VO45LOFBzgiyqmTLzIqWq6u1wrxKnAyz1HH6tgY/Mc81YzIjRPoYsPAEr4QV4l9TA==} - '@next/swc-darwin-arm64@16.1.6': - resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} + '@next/swc-darwin-arm64@16.2.0': + resolution: {integrity: sha512-/JZsqKzKt01IFoiLLAzlNqys7qk2F3JkcUhj50zuRhKDQkZNOz9E5N6wAQWprXdsvjRP4lTFj+/+36NSv5AwhQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.1.6': - resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} + '@next/swc-darwin-x64@16.2.0': + resolution: {integrity: sha512-/hV8erWq4SNlVgglUiW5UmQ5Hwy5EW/AbbXlJCn6zkfKxTy/E/U3V8U1Ocm2YCTUoFgQdoMxRyRMOW5jYy4ygg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.1.6': - resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} + '@next/swc-linux-arm64-gnu@16.2.0': + resolution: {integrity: sha512-GkjL/Q7MWOwqWR9zoxu1TIHzkOI2l2BHCf7FzeQG87zPgs+6WDh+oC9Sw9ARuuL/FUk6JNCgKRkA6rEQYadUaw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@16.1.6': - resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} + '@next/swc-linux-arm64-musl@16.2.0': + resolution: {integrity: sha512-1ffhC6KY5qWLg5miMlKJp3dZbXelEfjuXt1qcp5WzSCQy36CV3y+JT7OC1WSFKizGQCDOcQbfkH/IjZP3cdRNA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@16.1.6': - resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} + '@next/swc-linux-x64-gnu@16.2.0': + resolution: {integrity: sha512-FmbDcZQ8yJRq93EJSL6xaE0KK/Rslraf8fj1uViGxg7K4CKBCRYSubILJPEhjSgZurpcPQq12QNOJQ0DRJl6Hg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@16.1.6': - resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} + '@next/swc-linux-x64-musl@16.2.0': + resolution: {integrity: sha512-HzjIHVkmGAwRbh/vzvoBWWEbb8BBZPxBvVbDQDvzHSf3D8RP/4vjw7MNLDXFF9Q1WEzeQyEj2zdxBtVAHu5Oyw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@16.1.6': - resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} + '@next/swc-win32-arm64-msvc@16.2.0': + resolution: {integrity: sha512-UMiFNQf5H7+1ZsZPxEsA064WEuFbRNq/kEXyepbCnSErp4f5iut75dBA8UeerFIG3vDaQNOfCpevnERPp2V+nA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.1.6': - resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} + '@next/swc-win32-x64-msvc@16.2.0': + resolution: {integrity: sha512-DRrNJKW+/eimrZgdhVN1uvkN1OI4j6Lpefwr44jKQ0YQzztlmOBUUzHuV5GxOMPK3nmodAYElUVCY8ZXo/IWeA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -12226,8 +12226,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.1.6: - resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} + next@16.2.0: + resolution: {integrity: sha512-NLBVrJy1pbV1Yn00L5sU4vFyAHt5XuSjzrNyFnxo6Com0M0KrL6hHM5B99dbqXb2bE9pm4Ow3Zl1xp6HVY9edQ==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -16846,14 +16846,14 @@ snapshots: optionalDependencies: workerd: 1.20260305.0 - '@cloudflare/vitest-pool-workers@0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))': + '@cloudflare/vitest-pool-workers@0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))': dependencies: '@vitest/runner': 4.1.0 '@vitest/snapshot': 4.1.0 cjs-module-lexer: 1.4.3 esbuild: 0.27.3 miniflare: 4.20260305.0 - vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) wrangler: 4.69.0(@cloudflare/workers-types@4.20260226.1) transitivePeerDependencies: - '@cloudflare/workers-types' @@ -18620,30 +18620,30 @@ snapshots: '@netlify/runtime-utils@2.2.1': optional: true - '@next/env@16.1.6': {} + '@next/env@16.2.0': {} - '@next/swc-darwin-arm64@16.1.6': + '@next/swc-darwin-arm64@16.2.0': optional: true - '@next/swc-darwin-x64@16.1.6': + '@next/swc-darwin-x64@16.2.0': optional: true - '@next/swc-linux-arm64-gnu@16.1.6': + '@next/swc-linux-arm64-gnu@16.2.0': optional: true - '@next/swc-linux-arm64-musl@16.1.6': + '@next/swc-linux-arm64-musl@16.2.0': optional: true - '@next/swc-linux-x64-gnu@16.1.6': + '@next/swc-linux-x64-gnu@16.2.0': optional: true - '@next/swc-linux-x64-musl@16.1.6': + '@next/swc-linux-x64-musl@16.2.0': optional: true - '@next/swc-win32-arm64-msvc@16.1.6': + '@next/swc-win32-arm64-msvc@16.2.0': optional: true - '@next/swc-win32-x64-msvc@16.1.6': + '@next/swc-win32-x64-msvc@16.2.0': optional: true '@noble/ciphers@2.1.1': {} @@ -20831,10 +20831,10 @@ snapshots: '@scalar/helpers@0.2.16': {} - '@scalar/nextjs-api-reference@0.9.24(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)': + '@scalar/nextjs-api-reference@0.9.24(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)': dependencies: '@scalar/core': 0.3.43 - next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 '@scalar/types@0.6.8': @@ -22215,21 +22215,21 @@ snapshots: '@use-gesture/core': 10.3.1 react: 19.2.4 - '@vercel/analytics@1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3))': + '@vercel/analytics@1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3))': optionalDependencies: '@remix-run/react': 2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) '@sveltejs/kit': 2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) - next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 svelte: 5.53.5 vue: 3.5.29(typescript@5.9.3) vue-router: 4.6.4(vue@3.5.29(typescript@5.9.3)) - '@vercel/analytics@1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3))': + '@vercel/analytics@1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.53.5)(vue-router@4.6.4(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3))': optionalDependencies: '@remix-run/react': 2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) '@sveltejs/kit': 2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) - next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 svelte: 5.53.5 vue: 3.5.29(typescript@5.9.3) @@ -22417,7 +22417,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) '@vitest/utils@4.0.18': dependencies: @@ -25163,7 +25163,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6): + fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6): dependencies: '@formatjs/intl-localematcher': 0.8.1 '@orama/orama': 3.1.18 @@ -25197,14 +25197,14 @@ snapshots: algoliasearch: 5.46.2 lucide-react: 0.563.0(react@19.2.4) mdast-util-mdx-jsx: 3.2.0 - next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) zod: 4.3.6 transitivePeerDependencies: - supports-color - fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6): + fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6): dependencies: '@formatjs/intl-localematcher': 0.8.1 '@orama/orama': 3.1.18 @@ -25239,21 +25239,21 @@ snapshots: '@types/react': 19.2.14 algoliasearch: 5.46.2 lucide-react: 0.575.0(react@19.2.4) - next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) zod: 4.3.6 transitivePeerDependencies: - supports-color - fumadocs-mdx@14.2.7(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): + fumadocs-mdx@14.2.7(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 chokidar: 5.0.0 esbuild: 0.27.3 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) js-yaml: 4.1.1 mdast-util-to-markdown: 2.1.2 picocolors: 1.1.1 @@ -25272,20 +25272,20 @@ snapshots: '@types/react': 19.2.14 mdast-util-directive: 3.1.0 mdast-util-mdx-jsx: 3.2.0 - next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - fumadocs-mdx@14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): + fumadocs-mdx@14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 chokidar: 5.0.0 esbuild: 0.27.3 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) js-yaml: 4.1.1 mdast-util-mdx: 3.0.0 mdast-util-to-markdown: 2.1.2 @@ -25303,16 +25303,16 @@ snapshots: '@types/mdx': 2.0.13 '@types/react': 19.2.14 mdast-util-directive: 3.1.0 - next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - fumadocs-typescript@5.1.4(3749dc07ba6aad1af5ecb0ad432fe651): + fumadocs-typescript@5.1.4(6f1717d56d58a3cff48f6e7a0874b43c): dependencies: estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) hast-util-to-estree: 3.1.3 hast-util-to-jsx-runtime: 2.3.6 react: 19.2.4 @@ -25327,14 +25327,14 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 '@types/react': 19.2.14 - fumadocs-ui: 16.6.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) + fumadocs-ui: 16.6.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) transitivePeerDependencies: - supports-color - fumadocs-typescript@5.1.4(f245ce4745497b47498caec764b8c0fe): + fumadocs-typescript@5.1.4(9b4153ee01e9e4517d024462946a1b90): dependencies: estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) hast-util-to-estree: 3.1.3 hast-util-to-jsx-runtime: 2.3.6 react: 19.2.4 @@ -25349,11 +25349,11 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 '@types/react': 19.2.14 - fumadocs-ui: 16.5.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) + fumadocs-ui: 16.5.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) transitivePeerDependencies: - supports-color - fumadocs-ui@16.5.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1): + fumadocs-ui@16.5.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1): dependencies: '@fumadocs/tailwind': 0.0.2(tailwindcss@4.2.1) '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -25367,7 +25367,7 @@ snapshots: '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.4) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) class-variance-authority: 0.7.1 - fumadocs-core: 16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.5.2(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(mdast-util-mdx-jsx@3.2.0)(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) lucide-react: 0.563.0(react@19.2.4) motion: 12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next-themes: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -25379,13 +25379,13 @@ snapshots: tailwind-merge: 3.5.0 optionalDependencies: '@types/react': 19.2.14 - next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) tailwindcss: 4.2.1 transitivePeerDependencies: - '@emotion/is-prop-valid' - '@types/react-dom' - fumadocs-ui@16.6.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1): + fumadocs-ui@16.6.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1): dependencies: '@fumadocs/tailwind': 0.0.2(tailwindcss@4.2.1) '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -25399,7 +25399,7 @@ snapshots: '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.4) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) class-variance-authority: 0.7.1 - fumadocs-core: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) lucide-react: 0.575.0(react@19.2.4) motion: 12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next-themes: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -25413,7 +25413,7 @@ snapshots: unist-util-visit: 5.1.0 optionalDependencies: '@types/react': 19.2.14 - next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) transitivePeerDependencies: - '@emotion/is-prop-valid' - '@types/react-dom' @@ -25421,9 +25421,9 @@ snapshots: function-bind@1.1.2: {} - geist@1.7.0(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)): + geist@1.7.0(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)): dependencies: - next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) gel@2.2.0: dependencies: @@ -28193,9 +28193,9 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1): + next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1): dependencies: - '@next/env': 16.1.6 + '@next/env': 16.2.0 '@swc/helpers': 0.5.15 baseline-browser-mapping: 2.10.0 caniuse-lite: 1.0.30001774 @@ -28204,14 +28204,14 @@ snapshots: react-dom: 19.2.4(react@19.2.4) styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.4) optionalDependencies: - '@next/swc-darwin-arm64': 16.1.6 - '@next/swc-darwin-x64': 16.1.6 - '@next/swc-linux-arm64-gnu': 16.1.6 - '@next/swc-linux-arm64-musl': 16.1.6 - '@next/swc-linux-x64-gnu': 16.1.6 - '@next/swc-linux-x64-musl': 16.1.6 - '@next/swc-win32-arm64-msvc': 16.1.6 - '@next/swc-win32-x64-msvc': 16.1.6 + '@next/swc-darwin-arm64': 16.2.0 + '@next/swc-darwin-x64': 16.2.0 + '@next/swc-linux-arm64-gnu': 16.2.0 + '@next/swc-linux-arm64-musl': 16.2.0 + '@next/swc-linux-x64-gnu': 16.2.0 + '@next/swc-linux-x64-musl': 16.2.0 + '@next/swc-win32-arm64-msvc': 16.2.0 + '@next/swc-win32-x64-msvc': 16.2.0 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.58.2 babel-plugin-react-compiler: 1.0.0 @@ -31824,10 +31824,10 @@ snapshots: typescript@5.9.3: {} - typesense-fumadocs-adapter@0.3.0(40151152e36b86667babdaa0510dec49): + typesense-fumadocs-adapter@0.3.0(588ddc5beb77b81f1d770f6df2e4097f): dependencies: - fumadocs-core: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) - fumadocs-ui: 16.6.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) + fumadocs-core: 16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-ui: 16.6.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.7(@mdx-js/mdx@3.1.1)(@oramacloud/client@2.1.4)(@tanstack/react-router@1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(algoliasearch@5.46.2)(lucide-react@0.575.0(react@19.2.4))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.2.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) typescript: 5.9.3 @@ -32478,7 +32478,7 @@ snapshots: - tsx - yaml - vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): + vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@vitest/expect': 4.1.0 '@vitest/mocker': 4.1.0(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) From a9f34970fcd6992ee9bf9db97b74e34258fc31a9 Mon Sep 17 00:00:00 2001 From: Bereket Engida Date: Thu, 19 Mar 2026 12:24:33 -0700 Subject: [PATCH 87/88] chore: release v1.5.6 --- packages/api-key/package.json | 2 +- packages/better-auth/package.json | 2 +- packages/cli/package.json | 2 +- packages/core/package.json | 2 +- packages/drizzle-adapter/package.json | 2 +- packages/electron/package.json | 2 +- packages/expo/package.json | 2 +- packages/i18n/package.json | 2 +- packages/kysely-adapter/package.json | 2 +- packages/memory-adapter/package.json | 2 +- packages/mongo-adapter/package.json | 2 +- packages/oauth-provider/package.json | 2 +- packages/passkey/package.json | 2 +- packages/prisma-adapter/package.json | 2 +- packages/redis-storage/package.json | 2 +- packages/scim/package.json | 2 +- packages/sso/package.json | 2 +- packages/stripe/package.json | 2 +- packages/telemetry/package.json | 2 +- packages/test-utils/package.json | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/api-key/package.json b/packages/api-key/package.json index 88d0a640177..257d2316d05 100644 --- a/packages/api-key/package.json +++ b/packages/api-key/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/api-key", - "version": "1.5.5", + "version": "1.5.6", "description": "API Key plugin for Better Auth.", "type": "module", "license": "MIT", diff --git a/packages/better-auth/package.json b/packages/better-auth/package.json index 5b986eb53c2..aac3b9deef4 100644 --- a/packages/better-auth/package.json +++ b/packages/better-auth/package.json @@ -1,6 +1,6 @@ { "name": "better-auth", - "version": "1.5.5", + "version": "1.5.6", "description": "The most comprehensive authentication framework for TypeScript.", "type": "module", "license": "MIT", diff --git a/packages/cli/package.json b/packages/cli/package.json index 893adf82e72..4074241a8aa 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "auth", - "version": "1.5.5", + "version": "1.5.6", "description": "The CLI for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/core/package.json b/packages/core/package.json index e5beedd47c9..218570429c4 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/core", - "version": "1.5.5", + "version": "1.5.6", "description": "The most comprehensive authentication framework for TypeScript.", "type": "module", "license": "MIT", diff --git a/packages/drizzle-adapter/package.json b/packages/drizzle-adapter/package.json index 5fa77c14dff..b47ecdb7eff 100644 --- a/packages/drizzle-adapter/package.json +++ b/packages/drizzle-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/drizzle-adapter", - "version": "1.5.5", + "version": "1.5.6", "description": "Drizzle adapter for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/electron/package.json b/packages/electron/package.json index 9ebe65da10f..38c79c3475b 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/electron", - "version": "1.5.5", + "version": "1.5.6", "description": "Better Auth integration for Electron applications.", "type": "module", "license": "MIT", diff --git a/packages/expo/package.json b/packages/expo/package.json index c954d76616b..b77f0bd8776 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/expo", - "version": "1.5.5", + "version": "1.5.6", "description": "Better Auth integration for Expo and React Native applications.", "type": "module", "license": "MIT", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 834a0069a7d..06ba0d9f987 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/i18n", - "version": "1.5.5", + "version": "1.5.6", "description": "i18n plugin for Better Auth - translate error messages", "type": "module", "license": "MIT", diff --git a/packages/kysely-adapter/package.json b/packages/kysely-adapter/package.json index 6a5c44037c1..5ef9d89b6d0 100644 --- a/packages/kysely-adapter/package.json +++ b/packages/kysely-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/kysely-adapter", - "version": "1.5.5", + "version": "1.5.6", "description": "Kysely adapter for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/memory-adapter/package.json b/packages/memory-adapter/package.json index bfa5ae3f187..af019634a6e 100644 --- a/packages/memory-adapter/package.json +++ b/packages/memory-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/memory-adapter", - "version": "1.5.5", + "version": "1.5.6", "description": "Memory adapter for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/mongo-adapter/package.json b/packages/mongo-adapter/package.json index f022b28b6fa..7a91fd0d4fc 100644 --- a/packages/mongo-adapter/package.json +++ b/packages/mongo-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/mongo-adapter", - "version": "1.5.5", + "version": "1.5.6", "description": "Mongo adapter for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/oauth-provider/package.json b/packages/oauth-provider/package.json index fb0f1a5fd18..57ec1b8e32b 100644 --- a/packages/oauth-provider/package.json +++ b/packages/oauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/oauth-provider", - "version": "1.5.5", + "version": "1.5.6", "description": "An oauth provider plugin for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/passkey/package.json b/packages/passkey/package.json index cc7ef46b665..8103114fc82 100644 --- a/packages/passkey/package.json +++ b/packages/passkey/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/passkey", - "version": "1.5.5", + "version": "1.5.6", "description": "Passkey plugin for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/prisma-adapter/package.json b/packages/prisma-adapter/package.json index e2377f46dbc..f2f37481120 100644 --- a/packages/prisma-adapter/package.json +++ b/packages/prisma-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/prisma-adapter", - "version": "1.5.5", + "version": "1.5.6", "description": "Prisma adapter for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/redis-storage/package.json b/packages/redis-storage/package.json index fee44c36d48..693b69ebd86 100644 --- a/packages/redis-storage/package.json +++ b/packages/redis-storage/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/redis-storage", - "version": "1.5.5", + "version": "1.5.6", "description": "Redis storage for Better Auth secondary storage", "type": "module", "license": "MIT", diff --git a/packages/scim/package.json b/packages/scim/package.json index f69952004d7..2a4fbcc5c30 100644 --- a/packages/scim/package.json +++ b/packages/scim/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/scim", - "version": "1.5.5", + "version": "1.5.6", "description": "SCIM plugin for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/sso/package.json b/packages/sso/package.json index 92a87e0ed15..de36bced540 100644 --- a/packages/sso/package.json +++ b/packages/sso/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/sso", - "version": "1.5.5", + "version": "1.5.6", "description": "SSO plugin for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/stripe/package.json b/packages/stripe/package.json index fbc44eec4a1..84f81431e2f 100644 --- a/packages/stripe/package.json +++ b/packages/stripe/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/stripe", - "version": "1.5.5", + "version": "1.5.6", "description": "Stripe plugin for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index bc2c2aab16d..b9c6546bfd9 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/telemetry", - "version": "1.5.5", + "version": "1.5.6", "description": "Telemetry package for Better Auth", "type": "module", "license": "MIT", diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 75855a7c2a7..b611c21584f 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/test-utils", - "version": "1.5.5", + "version": "1.5.6", "description": "Testing utilities for Better Auth adapter development", "type": "module", "license": "MIT", From b1d163e6725d955a07db82c61631536d20748d13 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 20 Mar 2026 13:19:40 +0000 Subject: [PATCH 88/88] chore: sync upstream v1.5.6 + bump @btst to v2.1.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Vendor updated kysely adapter and CLI generators from v1.5.6 - Bump all @btst/* packages from 2.1.1 โ†’ 2.1.2 (patch: pure upstream sync) - Add @better-auth/core/instrumentation no-op stub to fix v1.5.6 build bug (upstream tagged v1.5.6 with better-auth importing @better-auth/core/instrumentation but forgot to include the instrumentation module in the @better-auth/core release) Co-authored-by: Ollie --- packages/btst/adapter-drizzle/package.json | 2 +- packages/btst/adapter-kysely/package.json | 2 +- .../adapter-kysely/src/bun-sqlite-dialect.ts | 4 +- .../adapter-kysely/src/d1-sqlite-dialect.ts | 4 +- packages/btst/adapter-kysely/src/dialect.ts | 6 +- .../btst/adapter-kysely/src/kysely-adapter.ts | 25 +- .../adapter-kysely/src/node-sqlite-dialect.ts | 4 +- packages/btst/adapter-kysely/src/types.ts | 4 +- packages/btst/adapter-memory/package.json | 2 +- packages/btst/adapter-mongodb/package.json | 2 +- packages/btst/adapter-prisma/package.json | 2 +- packages/btst/cli/package.json | 2 +- packages/btst/cli/src/generators/drizzle.ts | 4 +- packages/btst/cli/src/generators/kysely.ts | 4 +- packages/btst/cli/src/generators/prisma.ts | 8 +- packages/btst/cli/src/generators/types.ts | 4 +- .../btst/cli/src/utils/get-package-info.ts | 4 +- packages/btst/cli/src/utils/helper.ts | 4 +- packages/btst/db/package.json | 2 +- packages/btst/plugins/package.json | 2 +- packages/core/package.json | 8 + .../core/src/instrumentation/attributes.ts | 21 + packages/core/src/instrumentation/index.ts | 2 + packages/core/src/instrumentation/tracer.ts | 22 + packages/core/tsdown.config.ts | 1 + pnpm-lock.yaml | 1608 +++++++++++++++-- 26 files changed, 1573 insertions(+), 180 deletions(-) create mode 100644 packages/core/src/instrumentation/attributes.ts create mode 100644 packages/core/src/instrumentation/index.ts create mode 100644 packages/core/src/instrumentation/tracer.ts diff --git a/packages/btst/adapter-drizzle/package.json b/packages/btst/adapter-drizzle/package.json index fef7e92d662..cb25c7d4b76 100644 --- a/packages/btst/adapter-drizzle/package.json +++ b/packages/btst/adapter-drizzle/package.json @@ -1,6 +1,6 @@ { "name": "@btst/adapter-drizzle", - "version": "2.1.1", + "version": "2.1.2", "description": "Drizzle adapter for btst", "type": "module", "license": "MIT", diff --git a/packages/btst/adapter-kysely/package.json b/packages/btst/adapter-kysely/package.json index b81ec4cbb3e..45ab4c3a12b 100644 --- a/packages/btst/adapter-kysely/package.json +++ b/packages/btst/adapter-kysely/package.json @@ -1,6 +1,6 @@ { "name": "@btst/adapter-kysely", - "version": "2.1.1", + "version": "2.1.2", "description": "Kysely adapter for btst", "type": "module", "license": "MIT", diff --git a/packages/btst/adapter-kysely/src/bun-sqlite-dialect.ts b/packages/btst/adapter-kysely/src/bun-sqlite-dialect.ts index 55b60139b31..b340267ae34 100644 --- a/packages/btst/adapter-kysely/src/bun-sqlite-dialect.ts +++ b/packages/btst/adapter-kysely/src/bun-sqlite-dialect.ts @@ -1,9 +1,9 @@ /** * โš ๏ธ AUTO-GENERATED - DO NOT MODIFY - * + * * This file is automatically copied from better-auth. * Source: packages/kysely-adapter/src/bun-sqlite-dialect.ts - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ diff --git a/packages/btst/adapter-kysely/src/d1-sqlite-dialect.ts b/packages/btst/adapter-kysely/src/d1-sqlite-dialect.ts index 98b3ecc110d..12048dfde64 100644 --- a/packages/btst/adapter-kysely/src/d1-sqlite-dialect.ts +++ b/packages/btst/adapter-kysely/src/d1-sqlite-dialect.ts @@ -1,9 +1,9 @@ /** * โš ๏ธ AUTO-GENERATED - DO NOT MODIFY - * + * * This file is automatically copied from better-auth. * Source: packages/kysely-adapter/src/d1-sqlite-dialect.ts - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ diff --git a/packages/btst/adapter-kysely/src/dialect.ts b/packages/btst/adapter-kysely/src/dialect.ts index aa596e2091e..14482473c3a 100644 --- a/packages/btst/adapter-kysely/src/dialect.ts +++ b/packages/btst/adapter-kysely/src/dialect.ts @@ -1,13 +1,13 @@ /** * โš ๏ธ AUTO-GENERATED WITH PATCHES - DO NOT MODIFY - * + * * This file is automatically copied from better-auth with patches applied. * Source: packages/kysely-adapter/src/dialect.ts - * + * * Patches applied: * - @better-auth/core/utils imports replaced with local ../utils/string * (avoids dependency issues with published @better-auth/core package) - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ diff --git a/packages/btst/adapter-kysely/src/kysely-adapter.ts b/packages/btst/adapter-kysely/src/kysely-adapter.ts index 87643dea2aa..cef5040219f 100644 --- a/packages/btst/adapter-kysely/src/kysely-adapter.ts +++ b/packages/btst/adapter-kysely/src/kysely-adapter.ts @@ -1,17 +1,18 @@ /** * โš ๏ธ AUTO-GENERATED WITH PATCHES - DO NOT MODIFY - * + * * This file is automatically copied from better-auth with patches applied. * Source: packages/kysely-adapter/src/kysely-adapter.ts - * + * * Patches applied: * - @better-auth/core/utils imports replaced with local ../utils/string * (avoids dependency issues with published @better-auth/core package) - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ +import type { BetterAuthOptions } from "better-auth/types"; import type { AdapterFactoryCustomizeAdapterCreator, AdapterFactoryOptions, @@ -21,7 +22,7 @@ import type { Where, } from "better-auth/adapters"; import { createAdapterFactory } from "better-auth/adapters"; -import type { BetterAuthOptions } from "better-auth/types"; +import { capitalizeFirstLetter } from "./utils/string"; import type { InsertQueryBuilder, Kysely, @@ -30,7 +31,6 @@ import type { } from "kysely"; import { sql } from "kysely"; import type { KyselyDatabaseType } from "./types"; -import { capitalizeFirstLetter } from "./utils/string"; interface KyselyAdapterConfig { /** @@ -136,12 +136,17 @@ export const kyselyAdapter = ( return res; } - const value = values[field] || where[0]?.value; + const value = + values[field] !== undefined ? values[field] : where[0]?.value; res = await db .selectFrom(model) .selectAll() .orderBy(getFieldName({ model, field }), "desc") - .where(getFieldName({ model, field }), "=", value) + .where( + getFieldName({ model, field }), + value === null ? "is" : "=", + value, + ) .limit(1) .executeTakeFirst(); return res; @@ -201,11 +206,13 @@ export const kyselyAdapter = ( } if (operator === "eq") { - return eb(f, "=", value); + return value === null ? eb(f, "is", null) : eb(f, "=", value); } if (operator === "ne") { - return eb(f, "<>", value); + return value === null + ? eb(f, "is not", null) + : eb(f, "<>", value); } if (operator === "gt") { diff --git a/packages/btst/adapter-kysely/src/node-sqlite-dialect.ts b/packages/btst/adapter-kysely/src/node-sqlite-dialect.ts index 616276fe157..fb26ed32117 100644 --- a/packages/btst/adapter-kysely/src/node-sqlite-dialect.ts +++ b/packages/btst/adapter-kysely/src/node-sqlite-dialect.ts @@ -1,9 +1,9 @@ /** * โš ๏ธ AUTO-GENERATED - DO NOT MODIFY - * + * * This file is automatically copied from better-auth. * Source: packages/kysely-adapter/src/node-sqlite-dialect.ts - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ diff --git a/packages/btst/adapter-kysely/src/types.ts b/packages/btst/adapter-kysely/src/types.ts index c6cda89d25e..65eb73a65eb 100644 --- a/packages/btst/adapter-kysely/src/types.ts +++ b/packages/btst/adapter-kysely/src/types.ts @@ -1,9 +1,9 @@ /** * โš ๏ธ AUTO-GENERATED - DO NOT MODIFY - * + * * This file is automatically copied from better-auth. * Source: packages/kysely-adapter/src/types.ts - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ diff --git a/packages/btst/adapter-memory/package.json b/packages/btst/adapter-memory/package.json index 32cf2f5a9c5..1c141915db0 100644 --- a/packages/btst/adapter-memory/package.json +++ b/packages/btst/adapter-memory/package.json @@ -1,6 +1,6 @@ { "name": "@btst/adapter-memory", - "version": "2.1.1", + "version": "2.1.2", "description": "In-memory adapter for btst", "type": "module", "license": "MIT", diff --git a/packages/btst/adapter-mongodb/package.json b/packages/btst/adapter-mongodb/package.json index 923615bd6f2..0cbb844fa52 100644 --- a/packages/btst/adapter-mongodb/package.json +++ b/packages/btst/adapter-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@btst/adapter-mongodb", - "version": "2.1.1", + "version": "2.1.2", "description": "MongoDB adapter for btst", "type": "module", "license": "MIT", diff --git a/packages/btst/adapter-prisma/package.json b/packages/btst/adapter-prisma/package.json index 1340f32f862..faefde51cd9 100644 --- a/packages/btst/adapter-prisma/package.json +++ b/packages/btst/adapter-prisma/package.json @@ -1,6 +1,6 @@ { "name": "@btst/adapter-prisma", - "version": "2.1.1", + "version": "2.1.2", "description": "Prisma adapter for btst", "type": "module", "license": "MIT", diff --git a/packages/btst/cli/package.json b/packages/btst/cli/package.json index a7307b6a2a2..0007687fa48 100644 --- a/packages/btst/cli/package.json +++ b/packages/btst/cli/package.json @@ -1,6 +1,6 @@ { "name": "@btst/cli", - "version": "2.1.1", + "version": "2.1.2", "description": "CLI for btst schema generation and migration", "type": "module", "license": "MIT", diff --git a/packages/btst/cli/src/generators/drizzle.ts b/packages/btst/cli/src/generators/drizzle.ts index 579823f3ee3..72106524702 100644 --- a/packages/btst/cli/src/generators/drizzle.ts +++ b/packages/btst/cli/src/generators/drizzle.ts @@ -1,9 +1,9 @@ /** * โš ๏ธ AUTO-GENERATED - DO NOT MODIFY - * + * * This file is automatically copied from better-auth. * Source: packages/cli/src/generators/drizzle.ts - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ diff --git a/packages/btst/cli/src/generators/kysely.ts b/packages/btst/cli/src/generators/kysely.ts index b81e5140ab5..e3d9aadc955 100644 --- a/packages/btst/cli/src/generators/kysely.ts +++ b/packages/btst/cli/src/generators/kysely.ts @@ -1,9 +1,9 @@ /** * โš ๏ธ AUTO-GENERATED - DO NOT MODIFY - * + * * This file is automatically copied from better-auth. * Source: packages/cli/src/generators/kysely.ts - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ diff --git a/packages/btst/cli/src/generators/prisma.ts b/packages/btst/cli/src/generators/prisma.ts index 13ac34a3100..008e6efe52b 100644 --- a/packages/btst/cli/src/generators/prisma.ts +++ b/packages/btst/cli/src/generators/prisma.ts @@ -1,13 +1,13 @@ /** * โš ๏ธ AUTO-GENERATED WITH PATCHES - DO NOT MODIFY - * + * * This file is automatically copied from better-auth with patches applied. * Source: packages/cli/src/generators/prisma.ts - * + * * Patches applied: * - @better-auth/core/utils imports replaced with local ../utils/string * (avoids dependency issues with published @better-auth/core package) - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ @@ -15,12 +15,12 @@ import { existsSync } from "node:fs"; import fs from "node:fs/promises"; import path from "node:path"; +import { capitalizeFirstLetter } from "../utils/string"; import { produceSchema } from "@mrleebo/prisma-ast"; import { initGetFieldName, initGetModelName } from "better-auth/adapters"; import type { DBFieldType } from "better-auth/db"; import { getAuthTables } from "better-auth/db"; import { getPrismaVersion } from "../utils/get-package-info"; -import { capitalizeFirstLetter } from "../utils/string"; import type { SchemaGenerator } from "./types"; export const generatePrismaSchema: SchemaGenerator = async ({ diff --git a/packages/btst/cli/src/generators/types.ts b/packages/btst/cli/src/generators/types.ts index 31cc0b988cb..fabab54da24 100644 --- a/packages/btst/cli/src/generators/types.ts +++ b/packages/btst/cli/src/generators/types.ts @@ -1,9 +1,9 @@ /** * โš ๏ธ AUTO-GENERATED - DO NOT MODIFY - * + * * This file is automatically copied from better-auth. * Source: packages/cli/src/generators/types.ts - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ diff --git a/packages/btst/cli/src/utils/get-package-info.ts b/packages/btst/cli/src/utils/get-package-info.ts index 40d98418d0c..9ff6f9e8ca2 100644 --- a/packages/btst/cli/src/utils/get-package-info.ts +++ b/packages/btst/cli/src/utils/get-package-info.ts @@ -1,9 +1,9 @@ /** * โš ๏ธ AUTO-GENERATED - DO NOT MODIFY - * + * * This file is automatically copied from better-auth. * Source: packages/cli/src/utils/get-package-info.ts - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ diff --git a/packages/btst/cli/src/utils/helper.ts b/packages/btst/cli/src/utils/helper.ts index 41c9e3092e9..db5b2100779 100644 --- a/packages/btst/cli/src/utils/helper.ts +++ b/packages/btst/cli/src/utils/helper.ts @@ -1,9 +1,9 @@ /** * โš ๏ธ AUTO-GENERATED - DO NOT MODIFY - * + * * This file is automatically copied from better-auth. * Source: packages/cli/src/utils/helper.ts - * + * * To update: run `pnpm sync-upstream` * Any manual changes will be overwritten. */ diff --git a/packages/btst/db/package.json b/packages/btst/db/package.json index 70309762dfb..472e553f770 100644 --- a/packages/btst/db/package.json +++ b/packages/btst/db/package.json @@ -1,6 +1,6 @@ { "name": "@btst/db", - "version": "2.1.1", + "version": "2.1.2", "description": "Core database utilities and schema definition for btst", "type": "module", "license": "MIT", diff --git a/packages/btst/plugins/package.json b/packages/btst/plugins/package.json index 145c060e136..4c9976f7fdb 100644 --- a/packages/btst/plugins/package.json +++ b/packages/btst/plugins/package.json @@ -1,6 +1,6 @@ { "name": "@btst/plugins", - "version": "2.1.1", + "version": "2.1.2", "description": "Plugin utilities and common plugins for btst", "type": "module", "license": "MIT", diff --git a/packages/core/package.json b/packages/core/package.json index 218570429c4..5333ebb3fa6 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -96,6 +96,11 @@ "dev-source": "./src/oauth2/index.ts", "types": "./dist/oauth2/index.d.mts", "default": "./dist/oauth2/index.mjs" + }, + "./instrumentation": { + "dev-source": "./src/instrumentation/index.ts", + "types": "./dist/instrumentation/index.d.mts", + "default": "./dist/instrumentation/index.mjs" } }, "typesVersions": { @@ -135,6 +140,9 @@ ], "oauth2": [ "dist/oauth2/index.d.mts" + ], + "instrumentation": [ + "dist/instrumentation/index.d.mts" ] } }, diff --git a/packages/core/src/instrumentation/attributes.ts b/packages/core/src/instrumentation/attributes.ts new file mode 100644 index 00000000000..60de687df4a --- /dev/null +++ b/packages/core/src/instrumentation/attributes.ts @@ -0,0 +1,21 @@ +/** HTTP route attribute (e.g. /api/auth/sign-in). */ +export const ATTR_HTTP_ROUTE = "http.route" as const; + +/** HTTP response status code. */ +export const ATTR_HTTP_RESPONSE_STATUS_CODE = + "http.response.status_code" as const; + +/** Database collection name. */ +export const ATTR_DB_COLLECTION_NAME = "db.collection.name" as const; + +/** Database operation name. */ +export const ATTR_DB_OPERATION_NAME = "db.operation.name" as const; + +/** Operation identifier (e.g. getSession, signUpWithEmailAndPassword). */ +export const ATTR_OPERATION_ID = "better_auth.operation_id" as const; + +/** Hook type (e.g. before, after). */ +export const ATTR_HOOK_TYPE = "better_auth.hook.type" as const; + +/** Execution context (e.g. user, plugin:id). */ +export const ATTR_CONTEXT = "better_auth.context" as const; diff --git a/packages/core/src/instrumentation/index.ts b/packages/core/src/instrumentation/index.ts new file mode 100644 index 00000000000..c076618a804 --- /dev/null +++ b/packages/core/src/instrumentation/index.ts @@ -0,0 +1,2 @@ +export * from "./attributes"; +export * from "./tracer"; diff --git a/packages/core/src/instrumentation/tracer.ts b/packages/core/src/instrumentation/tracer.ts new file mode 100644 index 00000000000..b62edd45877 --- /dev/null +++ b/packages/core/src/instrumentation/tracer.ts @@ -0,0 +1,22 @@ +/** + * No-op span wrapper. Calls fn() directly; actual OpenTelemetry tracing is + * not included in this build. Install @opentelemetry/sdk-trace-node and + * configure a TracerProvider for real tracing. + */ +export function withSpan( + _name: string, + _attributes: Record, + fn: () => T, +): T; +export function withSpan( + _name: string, + _attributes: Record, + fn: () => Promise, +): Promise; +export function withSpan( + _name: string, + _attributes: Record, + fn: () => T | Promise, +): T | Promise { + return fn(); +} diff --git a/packages/core/tsdown.config.ts b/packages/core/tsdown.config.ts index 928b78eccf6..e9e85247da3 100644 --- a/packages/core/tsdown.config.ts +++ b/packages/core/tsdown.config.ts @@ -22,6 +22,7 @@ export default defineConfig({ "./src/utils/*.ts", "!./src/utils/*.test.ts", "./src/error/index.ts", + "./src/instrumentation/index.ts", ], deps: { neverBundle: ["@better-auth/core/async_hooks"], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1eb93429ca5..286c608b1bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,14 +13,20 @@ catalogs: specifier: 1.1.21 version: 1.1.21 better-call: - specifier: 2.0.2 - version: 2.0.2 + specifier: 1.3.2 + version: 1.3.2 tsdown: - specifier: 0.21.1 - version: 0.21.1 + specifier: 0.21.0-beta.2 + version: 0.21.0-beta.2 typescript: specifier: ^5.9.3 version: 5.9.3 + unbuild: + specifier: ^3.4.0 + version: 3.6.1 + vitest: + specifier: ^4.0.18 + version: 4.1.0 react19: '@types/react': specifier: ^19.2.14 @@ -1004,7 +1010,7 @@ importers: version: link:../better-auth tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/better-auth: dependencies: @@ -1046,7 +1052,7 @@ importers: version: 7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) better-call: specifier: 'catalog:' - version: 2.0.2(zod@4.3.6) + version: 1.3.2(zod@4.3.6) defu: specifier: ^6.1.4 version: 6.1.4 @@ -1087,15 +1093,6 @@ importers: '@lynx-js/react': specifier: ^0.116.3 version: 0.116.3(@types/react@19.2.14) - '@opentelemetry/api': - specifier: ^1.9.0 - version: 1.9.0 - '@opentelemetry/sdk-trace-base': - specifier: ^1.30.0 - version: 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': - specifier: ^1.30.0 - version: 1.30.1(@opentelemetry/api@1.9.0) '@sveltejs/kit': specifier: ^2.53.3 version: 2.53.3(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.53.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) @@ -1158,7 +1155,7 @@ importers: version: 18.6.2(@azure/core-client@1.10.1) tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) type-fest: specifier: ^5.4.4 version: 5.4.4 @@ -1172,6 +1169,228 @@ importers: specifier: ^3.5.29 version: 3.5.29(typescript@5.9.3) + packages/btst/adapter-drizzle: + dependencies: + '@btst/db': + specifier: workspace:* + version: link:../db + devDependencies: + '@better-auth/core': + specifier: workspace:* + version: link:../../core + better-auth: + specifier: workspace:* + version: link:../../better-auth + drizzle-orm: + specifier: ^0.38.2 + version: 0.38.4(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@types/react@19.2.14)(better-sqlite3@12.6.2)(bun-types@1.3.9)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(react@19.2.4) + typescript: + specifier: 'catalog:' + version: 5.9.3 + unbuild: + specifier: 'catalog:' + version: 3.6.1(sass@1.97.1)(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)) + + packages/btst/adapter-kysely: + dependencies: + '@btst/db': + specifier: workspace:* + version: link:../db + devDependencies: + '@better-auth/core': + specifier: workspace:* + version: link:../../core + better-auth: + specifier: workspace:* + version: link:../../better-auth + kysely: + specifier: ^0.28.5 + version: 0.28.11 + typescript: + specifier: 'catalog:' + version: 5.9.3 + unbuild: + specifier: 'catalog:' + version: 3.6.1(sass@1.97.1)(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)) + + packages/btst/adapter-memory: + dependencies: + '@btst/db': + specifier: workspace:* + version: link:../db + devDependencies: + '@better-auth/core': + specifier: workspace:* + version: link:../../core + better-auth: + specifier: workspace:* + version: link:../../better-auth + typescript: + specifier: 'catalog:' + version: 5.9.3 + unbuild: + specifier: 'catalog:' + version: 3.6.1(sass@1.97.1)(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)) + vitest: + specifier: 'catalog:' + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + + packages/btst/adapter-mongodb: + dependencies: + '@btst/db': + specifier: workspace:* + version: link:../db + mongodb: + specifier: ^6.0.0 + version: 6.21.0(socks@2.8.7) + devDependencies: + '@better-auth/core': + specifier: workspace:* + version: link:../../core + better-auth: + specifier: workspace:* + version: link:../../better-auth + typescript: + specifier: 'catalog:' + version: 5.9.3 + unbuild: + specifier: 'catalog:' + version: 3.6.1(sass@1.97.1)(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)) + + packages/btst/adapter-prisma: + dependencies: + '@btst/db': + specifier: workspace:* + version: link:../db + '@prisma/client': + specifier: ^5.0.0 + version: 5.22.0(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + devDependencies: + '@better-auth/core': + specifier: workspace:* + version: link:../../core + better-auth: + specifier: workspace:* + version: link:../../better-auth + typescript: + specifier: 'catalog:' + version: 5.9.3 + unbuild: + specifier: 'catalog:' + version: 3.6.1(sass@1.97.1)(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)) + + packages/btst/cli: + dependencies: + '@btst/db': + specifier: workspace:* + version: link:../db + '@mrleebo/prisma-ast': + specifier: ^0.13.0 + version: 0.13.1 + chalk: + specifier: ^5.6.2 + version: 5.6.2 + commander: + specifier: ^12.1.0 + version: 12.1.0 + jiti: + specifier: ^2.4.2 + version: 2.6.1 + prettier: + specifier: ^3.6.2 + version: 3.8.1 + prompts: + specifier: ^2.4.2 + version: 2.4.2 + yocto-spinner: + specifier: ^0.2.3 + version: 0.2.3 + devDependencies: + '@better-auth/core': + specifier: workspace:* + version: link:../../core + '@prisma/client': + specifier: ^5.22.0 + version: 5.22.0(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + '@types/better-sqlite3': + specifier: ^7.6.13 + version: 7.6.13 + '@types/node': + specifier: ^20.0.0 + version: 20.19.37 + '@types/pg': + specifier: ^8.11.10 + version: 8.16.0 + '@types/prompts': + specifier: ^2.4.9 + version: 2.4.9 + better-auth: + specifier: workspace:* + version: link:../../better-auth + drizzle-orm: + specifier: ^0.38.2 + version: 0.38.4(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@types/react@19.2.14)(better-sqlite3@12.6.2)(bun-types@1.3.9)(kysely@0.28.11)(mysql2@3.18.2(@types/node@20.19.37))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(react@19.2.4) + kysely: + specifier: ^0.28.5 + version: 0.28.11 + tsx: + specifier: ^4.20.5 + version: 4.21.0 + typescript: + specifier: 'catalog:' + version: 5.9.3 + unbuild: + specifier: 'catalog:' + version: 3.6.1(sass@1.97.1)(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)) + vitest: + specifier: 'catalog:' + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.37)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.7.0)(msw@2.12.10(@types/node@20.19.37)(typescript@5.9.3))(vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + optionalDependencies: + better-sqlite3: + specifier: ^12.2.0 + version: 12.6.2 + mysql2: + specifier: ^3.12.0 + version: 3.18.2(@types/node@20.19.37) + pg: + specifier: ^8.14.0 + version: 8.19.0 + + packages/btst/db: + dependencies: + '@better-auth/core': + specifier: workspace:* + version: link:../../core + better-auth: + specifier: workspace:* + version: link:../../better-auth + zod: + specifier: ^4.1.5 + version: 4.3.6 + devDependencies: + typescript: + specifier: 'catalog:' + version: 5.9.3 + unbuild: + specifier: 'catalog:' + version: 3.6.1(sass@1.97.1)(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)) + vitest: + specifier: 'catalog:' + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + + packages/btst/plugins: + dependencies: + '@btst/db': + specifier: workspace:* + version: link:../db + devDependencies: + typescript: + specifier: 'catalog:' + version: 5.9.3 + unbuild: + specifier: 'catalog:' + version: 3.6.1(sass@1.97.1)(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)) + packages/cli: dependencies: '@babel/core': @@ -1270,7 +1489,7 @@ importers: version: 4.56.10(tslib@2.8.1) tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) tsx: specifier: ^4.21.0 version: 4.21.0 @@ -1283,9 +1502,6 @@ importers: packages/core: dependencies: - '@opentelemetry/semantic-conventions': - specifier: ^1.39.0 - version: 1.39.0 '@standard-schema/spec': specifier: ^1.1.0 version: 1.1.0 @@ -1302,18 +1518,9 @@ importers: '@cloudflare/workers-types': specifier: ^4.20250121.0 version: 4.20260226.1 - '@opentelemetry/api': - specifier: ^1.9.0 - version: 1.9.0 - '@opentelemetry/sdk-trace-base': - specifier: ^1.30.0 - version: 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': - specifier: ^1.30.0 - version: 1.30.1(@opentelemetry/api@1.9.0) better-call: specifier: 'catalog:' - version: 2.0.2(zod@4.3.6) + version: 1.3.2(zod@4.3.6) jose: specifier: ^6.1.3 version: 6.1.3 @@ -1325,7 +1532,7 @@ importers: version: 1.1.1 tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/drizzle-adapter: devDependencies: @@ -1340,7 +1547,7 @@ importers: version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@upstash/redis@1.36.4)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1355,7 +1562,7 @@ importers: version: 1.1.21 better-call: specifier: 'catalog:' - version: 2.0.2(zod@4.3.6) + version: 1.3.2(zod@4.3.6) conf: specifier: ^15.0.2 version: 15.1.0 @@ -1380,7 +1587,7 @@ importers: version: 38.8.4 tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/expo: dependencies: @@ -1389,7 +1596,7 @@ importers: version: 1.1.21 better-call: specifier: 'catalog:' - version: 2.0.2(zod@4.3.6) + version: 1.3.2(zod@4.3.6) zod: specifier: ^4.3.6 version: 4.3.6 @@ -1417,7 +1624,7 @@ importers: version: 0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4) tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/i18n: devDependencies: @@ -1429,7 +1636,7 @@ importers: version: link:../better-auth tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/kysely-adapter: devDependencies: @@ -1447,7 +1654,7 @@ importers: version: 0.28.11 tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1462,7 +1669,7 @@ importers: version: 0.3.1 tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1480,7 +1687,7 @@ importers: version: 7.1.0(socks@2.8.7) tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1495,7 +1702,7 @@ importers: version: 1.1.21 better-call: specifier: 'catalog:' - version: 2.0.2(zod@4.3.6) + version: 1.3.2(zod@4.3.6) jose: specifier: ^6.1.3 version: 6.1.3 @@ -1517,7 +1724,7 @@ importers: version: 1.9.0 tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/passkey: dependencies: @@ -1535,7 +1742,7 @@ importers: version: 13.2.3 better-call: specifier: 'catalog:' - version: 2.0.2(zod@4.3.6) + version: 1.3.2(zod@4.3.6) nanostores: specifier: ^1.0.1 version: 1.1.1 @@ -1551,7 +1758,7 @@ importers: version: link:../better-auth tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/prisma-adapter: dependencies: @@ -1570,7 +1777,7 @@ importers: version: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1588,7 +1795,7 @@ importers: version: 5.9.3 tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1606,7 +1813,7 @@ importers: version: link:../better-auth better-call: specifier: 'catalog:' - version: 2.0.2(zod@4.3.6) + version: 1.3.2(zod@4.3.6) zod: specifier: ^4.3.6 version: 4.3.6 @@ -1619,7 +1826,7 @@ importers: version: link:../sso tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/sso: dependencies: @@ -1659,7 +1866,7 @@ importers: version: link:../better-auth better-call: specifier: 'catalog:' - version: 2.0.2(zod@4.3.6) + version: 1.3.2(zod@4.3.6) body-parser: specifier: ^2.2.2 version: 2.2.2 @@ -1671,7 +1878,7 @@ importers: version: 8.2.2 tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/stripe: dependencies: @@ -1690,13 +1897,13 @@ importers: version: link:../better-auth better-call: specifier: 'catalog:' - version: 2.0.2(zod@4.3.6) + version: 1.3.2(zod@4.3.6) stripe: specifier: ^20.4.0 version: 20.4.0(@types/node@25.5.0) tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) packages/telemetry: dependencies: @@ -1712,7 +1919,7 @@ importers: version: link:../core tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) type-fest: specifier: ^5.4.4 version: 5.4.4 @@ -1727,7 +1934,7 @@ importers: version: link:../better-auth tsdown: specifier: 'catalog:' - version: 0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) vitest: specifier: catalog:vitest version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18)(happy-dom@20.7.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) @@ -1750,7 +1957,7 @@ importers: specifier: ^6.8.2 version: 6.8.2 undici: - specifier: ^7.24.0 + specifier: ^7.22.0 version: 7.24.1 vitest: specifier: catalog:vitest @@ -4666,10 +4873,6 @@ packages: resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.39.0': - resolution: {integrity: sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==} - engines: {node: '>=14'} - '@orama/cuid2@2.2.3': resolution: {integrity: sha512-Lcak3chblMejdlSHgYU2lS2cdOhDpU6vkfIJH4m+YKvqQyLqs1bB8+w6NT1MG5bO12NUK2GFc34Mn2xshMIQ1g==} @@ -4680,6 +4883,9 @@ packages: '@oramacloud/client@2.1.4': resolution: {integrity: sha512-uNPFs4wq/iOPbggCwTkVNbIr64Vfd7ZS/h+cricXVnzXWocjDTfJ3wLL4lr0qiSu41g8z+eCAGBqJ30RO2O4AA==} + '@oxc-project/types@0.114.0': + resolution: {integrity: sha512-//nBfbzHQHvJs8oFIjv6coZ6uxQ4alLfiPe6D5vit6c4pmxATHHlVwgB1k+Hv4yoAMyncdxgRBF5K4BYWUCzvA==} + '@oxc-project/types@0.115.0': resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==} @@ -6120,36 +6326,73 @@ packages: resolution: {integrity: sha512-C7c51Nn4yTxXFKvgh2txJFNweaVcfUPQxwEUFw4aWsCmfiBDJsTSwviIF8EcwjQ6k8bPyMWCl1vw4BdxE569Cg==} engines: {node: '>= 10'} + '@rolldown/binding-android-arm64@1.0.0-rc.5': + resolution: {integrity: sha512-zCEmUrt1bggwgBgeKLxNj217J1OrChrp3jJt24VK9jAharSTeVaHODNL+LpcQVhRz+FktYWfT9cjo5oZ99ZLpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-android-arm64@1.0.0-rc.8': resolution: {integrity: sha512-5bcmMQDWEfWUq3m79Mcf/kbO6e5Jr6YjKSsA1RnpXR6k73hQ9z1B17+4h93jXpzHvS18p7bQHM1HN/fSd+9zog==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-rc.5': + resolution: {integrity: sha512-ZP9xb9lPAex36pvkNWCjSEJW/Gfdm9I3ssiqOFLmpZ/vosPXgpoGxCmh+dX1Qs+/bWQE6toNFXWWL8vYoKoK9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-rc.8': resolution: {integrity: sha512-dcHPd5N4g9w2iiPRJmAvO0fsIWzF2JPr9oSuTjxLL56qu+oML5aMbBMNwWbk58Mt3pc7vYs9CCScwLxdXPdRsg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.5': + resolution: {integrity: sha512-7IdrPunf6dp9mywMgTOKMMGDnMHQ6+h5gRl6LW8rhD8WK2kXX0IwzcM5Zc0B5J7xQs8QWOlKjv8BJsU/1CD3pg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.8': resolution: {integrity: sha512-mw0VzDvoj8AuR761QwpdCFN0sc/jspuc7eRYJetpLWd+XyansUrH3C7IgNw6swBOgQT9zBHNKsVCjzpfGJlhUA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-rc.5': + resolution: {integrity: sha512-o/JCk+dL0IN68EBhZ4DqfsfvxPfMeoM6cJtxORC1YYoxGHZyth2Kb2maXDb4oddw2wu8iIbnYXYPEzBtAF5CAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-rc.8': resolution: {integrity: sha512-xNrRa6mQ9NmMIJBdJtPMPG8Mso0OhM526pDzc/EKnRrIrrkHD1E0Z6tONZRmUeJElfsQ6h44lQQCcDilSNIvSQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.5': + resolution: {integrity: sha512-IIBwTtA6VwxQLcEgq2mfrUgam7VvPZjhd/jxmeS1npM+edWsrrpRLHUdze+sk4rhb8/xpP3flemgcZXXUW6ukw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.8': resolution: {integrity: sha512-WgCKoO6O/rRUwimWfEJDeztwJJmuuX0N2bYLLRxmXDTtCwjToTOqk7Pashl/QpQn3H/jHjx0b5yCMbcTVYVpNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.5': + resolution: {integrity: sha512-KSol1De1spMZL+Xg7K5IBWXIvRWv7+pveaxFWXpezezAG7CS6ojzRjtCGCiLxQricutTAi/LkNWKMsd2wNhMKQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.8': resolution: {integrity: sha512-tOHgTOQa8G4Z3ULj4G3NYOGGJEsqPHR91dT72u63OtVsZ7B6wFJKOx+ZKv+pvwzxWz92/I2ycaqi2/Ll4l+rlg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6157,6 +6400,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.5': + resolution: {integrity: sha512-WFljyDkxtXRlWxMjxeegf7xMYXxUr8u7JdXlOEWKYgDqEgxUnSEsVDxBiNWQ1D5kQKwf8Wo4sVKEYPRhCdsjwA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.8': resolution: {integrity: sha512-oRbxcgDujCi2Yp1GTxoUFsIFlZsuPHU4OV4AzNc3/6aUmR4lfm9FK0uwQu82PJsuUwnF2jFdop3Ep5c1uK7Uxg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6178,6 +6428,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.5': + resolution: {integrity: sha512-CUlplTujmbDWp2gamvrqVKi2Or8lmngXT1WxsizJfts7JrvfGhZObciaY/+CbdbS9qNnskvwMZNEhTPrn7b+WA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.8': resolution: {integrity: sha512-a1+F0aV4Wy9tT3o+cHl3XhOy6aFV+B8Ll+/JFj98oGkb6lGk3BNgrxd+80RwYRVd23oLGvj3LwluKYzlv1PEuw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6185,6 +6442,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.5': + resolution: {integrity: sha512-wdf7g9NbVZCeAo2iGhsjJb7I8ZFfs6X8bumfrWg82VK+8P6AlLXwk48a1ASiJQDTS7Svq2xVzZg3sGO2aXpHRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.8': resolution: {integrity: sha512-bGyXCFU11seFrf7z8PcHSwGEiFVkZ9vs+auLacVOQrVsI8PFHJzzJROF3P6b0ODDmXr0m6Tj5FlDhcXVk0Jp8w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6192,23 +6456,46 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.5': + resolution: {integrity: sha512-0CWY7ubu12nhzz+tkpHjoG3IRSTlWYe0wrfJRf4qqjqQSGtAYgoL9kwzdvlhaFdZ5ffVeyYw9qLsChcjUMEloQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.8': resolution: {integrity: sha512-n8d+L2bKgf9G3+AM0bhHFWdlz9vYKNim39ujRTieukdRek0RAo2TfG2uEnV9spa4r4oHUfL9IjcY3M9SlqN1gw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.5': + resolution: {integrity: sha512-LztXnGzv6t2u830mnZrFLRVqT/DPJ9DL4ZTz/y93rqUVkeHjMMYIYaFj+BUthiYxbVH9dH0SZYufETspKY/NhA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.8': resolution: {integrity: sha512-4R4iJDIk7BrJdteAbEAICXPoA7vZoY/M0OBfcRlQxzQvUYMcEp2GbC/C8UOgQJhu2TjGTpX1H8vVO1xHWcRqQA==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.5': + resolution: {integrity: sha512-jUct1XVeGtyjqJXEAfvdFa8xoigYZ2rge7nYEm70ppQxpfH9ze2fbIrpHmP2tNM2vL/F6Dd0CpXhpjPbC6bSxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.8': resolution: {integrity: sha512-3lwnklba9qQOpFnQ7EW+A1m4bZTWXZE4jtehsZ0YOl2ivW1FQqp5gY7X2DLuKITggesyuLwcmqS11fA7NtrmrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.5': + resolution: {integrity: sha512-VQ8F9ld5gw29epjnVGdrx8ugiLTe8BMqmhDYy7nGbdeDo4HAt4bgdZvLbViEhg7DZyHLpiEUlO5/jPSUrIuxRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.8': resolution: {integrity: sha512-VGjCx9Ha1P/r3tXGDZyG0Fcq7Q0Afnk64aaKzr1m40vbn1FL8R3W0V1ELDvPgzLXaaqK/9PnsqSaLWXfn6JtGQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6218,9 +6505,21 @@ packages: '@rolldown/pluginutils@1.0.0-beta.40': resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} + '@rolldown/pluginutils@1.0.0-rc.5': + resolution: {integrity: sha512-RxlLX/DPoarZ9PtxVrQgZhPoor987YtKQqCo5zkjX+0S0yLJ7Vv515Wk6+xtTL67VONKJKxETWZwuZjss2idYw==} + '@rolldown/pluginutils@1.0.0-rc.8': resolution: {integrity: sha512-wzJwL82/arVfeSP3BLr1oTy40XddjtEdrdgtJ4lLRBu06mP3q/8HGM6K0JRlQuTA3XB0pNJx2so/nmpY4xyOew==} + '@rollup/plugin-alias@5.1.1': + resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} engines: {node: '>=20.19.0'} @@ -6230,6 +6529,15 @@ packages: rollup: optional: true + '@rollup/plugin-commonjs@28.0.9': + resolution: {integrity: sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/plugin-commonjs@29.0.0': resolution: {integrity: sha512-U2YHaxR2cU/yAiwKJtJRhnyLk7cifnQw0zUpISsocBDoHDJn+HTV74ABqnwr5bEgWUwFZC9oFL6wLe21lHu5eQ==} engines: {node: '>=16.0.0 || 14 >= 14.17'} @@ -7289,6 +7597,9 @@ packages: '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + '@types/node@20.19.37': + resolution: {integrity: sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==} + '@types/node@22.19.13': resolution: {integrity: sha512-akNQMv0wW5uyRpD2v2IEyRSZiR+BeGuoB6L310EgGObO44HSMNT8z1xzio28V8qOrgYaopIDNA18YgdXd+qTiw==} @@ -7395,6 +7706,9 @@ packages: '@types/whatwg-mimetype@3.0.2': resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/whatwg-url@11.0.5': + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + '@types/whatwg-url@13.0.0': resolution: {integrity: sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==} @@ -7867,6 +8181,13 @@ packages: atomically@2.1.1: resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} + autoprefixer@10.4.27: + resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + aws-ssl-profiles@1.1.2: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} engines: {node: '>= 6.0.0'} @@ -8009,8 +8330,8 @@ packages: peerDependencies: better-auth: ^1.0.3 - better-call@2.0.2: - resolution: {integrity: sha512-QqSKtfJD/ZzQdlm7BTUxT9RCA0AxcrZEMyU/yl7/uoFDoR7YCTdc555xQXjReo75M6/xkskPawPdhbn3fge4Cg==} + better-call@1.3.2: + resolution: {integrity: sha512-4cZIfrerDsNTn3cm+MhLbUePN0gdwkhSXEuG7r/zuQ8c/H7iU0/jSK5TD3FW7U0MgKHce/8jGpPYNO4Ve+4NBw==} peerDependencies: zod: ^4.0.0 peerDependenciesMeta: @@ -8108,6 +8429,10 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bson@6.10.4: + resolution: {integrity: sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==} + engines: {node: '>=16.20.1'} + bson@7.2.0: resolution: {integrity: sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ==} engines: {node: '>=20.19.0'} @@ -8167,10 +8492,6 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - cac@7.0.0: - resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} - engines: {node: '>=20.19.0'} - cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -8219,6 +8540,9 @@ packages: peerDependencies: three: '>=0.126.1' + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + caniuse-lite@1.0.30001774: resolution: {integrity: sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==} @@ -8434,6 +8758,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} @@ -8451,6 +8778,10 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -8674,6 +9005,12 @@ packages: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} + css-declaration-sorter@7.3.1: + resolution: {integrity: sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + css-gradient-parser@0.0.16: resolution: {integrity: sha512-3O5QdqgFRUbXvK1x5INf1YkBz1UKSWqrd63vWsum8MNHDBYD5urm3QtxZbKU259OrEXNM26lP/MPY3d1IGkBgA==} engines: {node: '>=16'} @@ -8688,6 +9025,14 @@ packages: css-to-react-native@3.2.0: resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-what@6.2.2: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} @@ -8697,6 +9042,28 @@ packages: engines: {node: '>=4'} hasBin: true + cssnano-preset-default@7.0.11: + resolution: {integrity: sha512-waWlAMuCakP7//UCY+JPrQS1z0OSLeOXk2sKWJximKWGupVxre50bzPlvpbUwZIDylhf/ptf0Pk+Yf7C+hoa3g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + cssnano-utils@5.0.1: + resolution: {integrity: sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + cssnano@7.1.3: + resolution: {integrity: sha512-mLFHQAzyapMVFLiJIn7Ef4C2UCEvtlTlbyILR6B5ZsUAV3D/Pa761R5uC1YPhyBkRd3eqaDm2ncaNrD7R4mTRg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -9109,8 +9476,8 @@ packages: resolution: {integrity: sha512-GViD3IgsXn7trFyBUUHyTFBpH/FsHTxYJ66qdbVggxef4UBPHRYxQaRzYLTuekYnk9i5FIEL9pbBIwMqX/Uwrg==} hasBin: true - drizzle-orm@0.41.0: - resolution: {integrity: sha512-7A4ZxhHk9gdlXmTdPj/lREtP+3u8KvZ4yEN6MYVxBzZGex5Wtdc+CWSbu7btgF6TB0N+MNPrvW7RKBbxJchs/Q==} + drizzle-orm@0.38.4: + resolution: {integrity: sha512-s7/5BpLKO+WJRHspvpqTydxFob8i1vo2rEx4pY6TGY7QSMuUfWUuzaY0DIpXCkgHOo37BaFC+SJQb99dDUXT3Q==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=4' @@ -9125,13 +9492,105 @@ packages: '@tidbcloud/serverless': '*' '@types/better-sqlite3': '*' '@types/pg': '*' + '@types/react': '>=18' '@types/sql.js': '*' '@vercel/postgres': '>=0.8.0' '@xata.io/client': '*' better-sqlite3: '>=7' bun-types: '*' expo-sqlite: '>=14.0.0' - gel: '>=2' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + drizzle-orm@0.41.0: + resolution: {integrity: sha512-7A4ZxhHk9gdlXmTdPj/lREtP+3u8KvZ4yEN6MYVxBzZGex5Wtdc+CWSbu7btgF6TB0N+MNPrvW7RKBbxJchs/Q==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + gel: '>=2' knex: '*' kysely: '*' mysql2: '>=2' @@ -9883,6 +10342,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + fkill@9.0.0: resolution: {integrity: sha512-MdYSsbdCaIRjzo5edthZtWmEZVMfr1qrtYZUHIdO3swCE+CoZA8S5l0s4jDsYlTa9ZiXv0pTgpzE7s4N8NeUOA==} engines: {node: '>=18'} @@ -9941,6 +10403,9 @@ packages: react-dom: optional: true + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + framer-motion@12.34.3: resolution: {integrity: sha512-v81ecyZKYO/DfpTwHivqkxSUBzvceOpoI+wLfgCgoUIKxlFKEXdg0oR9imxwXumT4SFy8vRk9xzJ5l3/Du/55Q==} peerDependencies: @@ -11348,6 +11813,10 @@ packages: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + linebreak@1.1.0: resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} @@ -11413,12 +11882,18 @@ packages: lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -11638,6 +12113,12 @@ packages: mdast-util-toc@7.1.0: resolution: {integrity: sha512-2TVKotOQzqdY7THOdn2gGzS9d1Sdd66bvxUyw3aNpWfcPXCLYSJCCgfPy30sEtuzkDraJgqF35dzgmz6xlvH/w==} + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -12078,16 +12559,67 @@ packages: engines: {node: '>=10'} hasBin: true + mkdist@2.4.1: + resolution: {integrity: sha512-Ezk0gi04GJBkqMfsksICU5Rjoemc4biIekwgrONWVPor2EO/N9nBgN6MZXAf7Yw4mDDhrNyKbdETaHNevfumKg==} + hasBin: true + peerDependencies: + sass: ^1.92.1 + typescript: '>=5.9.2' + vue: ^3.5.21 + vue-sfc-transformer: ^0.1.1 + vue-tsc: ^1.8.27 || ^2.0.21 || ^3.0.0 + peerDependenciesMeta: + sass: + optional: true + typescript: + optional: true + vue: + optional: true + vue-sfc-transformer: + optional: true + vue-tsc: + optional: true + mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} module-details-from-path@1.0.4: resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} + mongodb-connection-string-url@7.0.1: resolution: {integrity: sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==} engines: {node: '>=20.19.0'} + mongodb@6.21.0: + resolution: {integrity: sha512-URyb/VXMjJ4da46OeSXg+puO39XH9DeQpWCslifrRn9JWugy0D+DvvBvkm2WxmHe61O/H19JM66p1z7RHVkZ6A==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.3.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + mongodb@7.1.0: resolution: {integrity: sha512-kMfnKunbolQYwCIyrkxNJFB4Ypy91pYqua5NargS/f8ODNSJxT03ZU3n1JqL4mCzbSih8tvmMEMLpKTT7x5gCg==} engines: {node: '>=20.19.0'} @@ -12791,10 +13323,178 @@ packages: postal-mime@2.7.3: resolution: {integrity: sha512-MjhXadAJaWgYzevi46+3kLak8y6gbg0ku14O1gO/LNOuay8dO+1PtcSGvAdgDR0DoIsSaiIA8y/Ddw6MnrO0Tw==} + postcss-calc@10.1.1: + resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} + engines: {node: ^18.12 || ^20.9 || >=22.0} + peerDependencies: + postcss: ^8.4.38 + + postcss-colormin@7.0.6: + resolution: {integrity: sha512-oXM2mdx6IBTRm39797QguYzVEWzbdlFiMNfq88fCCN1Wepw3CYmJ/1/Ifa/KjWo+j5ZURDl2NTldLJIw51IeNQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-convert-values@7.0.9: + resolution: {integrity: sha512-l6uATQATZaCa0bckHV+r6dLXfWtUBKXxO3jK+AtxxJJtgMPD+VhhPCCx51I4/5w8U5uHV67g3w7PXj+V3wlMlg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-comments@7.0.6: + resolution: {integrity: sha512-Sq+Fzj1Eg5/CPf1ERb0wS1Im5cvE2gDXCE+si4HCn1sf+jpQZxDI4DXEp8t77B/ImzDceWE2ebJQFXdqZ6GRJw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-duplicates@7.0.2: + resolution: {integrity: sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-empty@7.0.1: + resolution: {integrity: sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-overridden@7.0.1: + resolution: {integrity: sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-merge-longhand@7.0.5: + resolution: {integrity: sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-merge-rules@7.0.8: + resolution: {integrity: sha512-BOR1iAM8jnr7zoQSlpeBmCsWV5Uudi/+5j7k05D0O/WP3+OFMPD86c1j/20xiuRtyt45bhxw/7hnhZNhW2mNFA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-font-values@7.0.1: + resolution: {integrity: sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-gradients@7.0.1: + resolution: {integrity: sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-params@7.0.6: + resolution: {integrity: sha512-YOn02gC68JijlaXVuKvFSCvQOhTpblkcfDre2hb/Aaa58r2BIaK4AtE/cyZf2wV7YKAG+UlP9DT+By0ry1E4VQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-selectors@7.0.6: + resolution: {integrity: sha512-lIbC0jy3AAwDxEgciZlBullDiMBeBCT+fz5G8RcA9MWqh/hfUkpOI3vNDUNEZHgokaoiv0juB9Y8fGcON7rU/A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-nested@7.0.2: + resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-normalize-charset@7.0.1: + resolution: {integrity: sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-display-values@7.0.1: + resolution: {integrity: sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-positions@7.0.1: + resolution: {integrity: sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-repeat-style@7.0.1: + resolution: {integrity: sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-string@7.0.1: + resolution: {integrity: sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-timing-functions@7.0.1: + resolution: {integrity: sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-unicode@7.0.6: + resolution: {integrity: sha512-z6bwTV84YW6ZvvNoaNLuzRW4/uWxDKYI1iIDrzk6D2YTL7hICApy+Q1LP6vBEsljX8FM7YSuV9qI79XESd4ddQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-url@7.0.1: + resolution: {integrity: sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-whitespace@7.0.1: + resolution: {integrity: sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-ordered-values@7.0.2: + resolution: {integrity: sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-reduce-initial@7.0.6: + resolution: {integrity: sha512-G6ZyK68AmrPdMB6wyeA37ejnnRG2S8xinJrZJnOv+IaRKf6koPAVbQsiC7MfkmXaGmF1UO+QCijb27wfpxuRNg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-reduce-transforms@7.0.1: + resolution: {integrity: sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + postcss-selector-parser@7.1.1: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} + postcss-svgo@7.1.1: + resolution: {integrity: sha512-zU9H9oEDrUFKa0JB7w+IYL7Qs9ey1mZyjhbf0KLxwJDdDRtoPvCmaEfknzqfHj44QS9VD6c5sJnBAVYTLRg/Sg==} + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} + peerDependencies: + postcss: ^8.4.32 + + postcss-unique-selectors@7.0.5: + resolution: {integrity: sha512-3QoYmEt4qg/rUWDn6Tc8+ZVPmbp4G1hXDtCNWDx0st8SjtCbRcxRXDDM1QrEiXGG3A45zscSJFb4QH90LViyxg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -13767,11 +14467,23 @@ packages: vue-tsc: optional: true + rolldown@1.0.0-rc.5: + resolution: {integrity: sha512-0AdalTs6hNTioaCYIkAa7+xsmHBfU5hCNclZnM/lp7lGGDuUOb6N4BVNtwiomybbencDjq/waKjTImqiGCs5sw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rolldown@1.0.0-rc.8: resolution: {integrity: sha512-RGOL7mz/aoQpy/y+/XS9iePBfeNRDUdozrhCEJxdpJyimW8v6yp4c30q6OviUU5AnUJVLRL9GP//HUs6N3ALrQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rollup-plugin-dts@6.4.0: + resolution: {integrity: sha512-2i00A5UoPCoDecLEs13Eu105QegSGfrbp1sDeUj/54LKGmv6XFHDxWKC6Wsb4BobGUWYVCWWjmjAc8bXXbXH/Q==} + engines: {node: '>=16'} + peerDependencies: + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 || ^6.0 + rollup-plugin-visualizer@6.0.5: resolution: {integrity: sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==} engines: {node: '>=18'} @@ -14326,6 +15038,12 @@ packages: babel-plugin-macros: optional: true + stylehacks@7.0.8: + resolution: {integrity: sha512-I3f053GBLIiS5Fg6OMFhq/c+yW+5Hc2+1fgq7gElDMMSqwlRb3tBf2ef6ucLStYRpId4q//bQO1FjcyNyy4yDQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} @@ -14379,6 +15097,11 @@ packages: resolution: {integrity: sha512-YkqERnF05g8KLdDZwZrF8/i1eSbj6Eoat8Jjr2IfruZz9StLuBqo8sfCSzjosNKd+ZrQ8DkKZDjpO5y3ht1Pow==} engines: {node: '>=18'} + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} + engines: {node: '>=16'} + hasBin: true + svix@1.84.1: resolution: {integrity: sha512-K8DPPSZaW/XqXiz1kEyzSHYgmGLnhB43nQCMeKjWGCUpLIpAMMM8kx3rVVOSm6Bo6EHyK1RQLPT4R06skM/MlQ==} @@ -14635,31 +15358,28 @@ packages: ts-morph@27.0.2: resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} - tsdown@0.21.1: - resolution: {integrity: sha512-2Qgm5Pztm1ZOBr6AfJ4pAlspuufa5SlnBgnUx7a0QSm0a73FrBETiRB422gHtMKbgWf1oUtjBL/eK+po7OXwKw==} + tsdown@0.21.0-beta.2: + resolution: {integrity: sha512-OKj8mKf0ws1ucxuEi3mO/OGyfRQxO9MY2D6SoIE/7RZcbojsZSBhJr4xC4MNivMqrQvi3Ke2e+aRZDemPBWPCw==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: '@arethetypeswrong/core': ^0.18.1 - '@tsdown/css': 0.21.1 - '@tsdown/exe': 0.21.1 '@vitejs/devtools': '*' publint: ^0.3.0 typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 unplugin-unused: ^0.5.0 peerDependenciesMeta: '@arethetypeswrong/core': optional: true - '@tsdown/css': - optional: true - '@tsdown/exe': - optional: true '@vitejs/devtools': optional: true publint: optional: true typescript: optional: true + unplugin-lightningcss: + optional: true unplugin-unused: optional: true @@ -14806,6 +15526,15 @@ packages: ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + unbuild@3.6.1: + resolution: {integrity: sha512-+U5CdtrdjfWkZhuO4N9l5UhyiccoeMEXIc2Lbs30Haxb+tRwB3VwB8AoZRxlAzORXunenSo+j6lh45jx+xkKgg==} + hasBin: true + peerDependencies: + typescript: ^5.9.2 + peerDependenciesMeta: + typescript: + optional: true + unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} @@ -15924,7 +16653,7 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.6.0 - tinyexec: 1.0.2 + tinyexec: 1.0.4 '@arethetypeswrong/cli@0.18.2': dependencies: @@ -16143,7 +16872,7 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -16721,7 +17450,7 @@ snapshots: '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@babel/traverse@7.29.0': @@ -16729,7 +17458,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.3 @@ -18082,6 +18811,14 @@ snapshots: '@inquirer/ansi@1.0.2': {} + '@inquirer/confirm@5.1.21(@types/node@20.19.37)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.19.37) + '@inquirer/type': 3.0.10(@types/node@20.19.37) + optionalDependencies: + '@types/node': 20.19.37 + optional: true + '@inquirer/confirm@5.1.21(@types/node@25.3.2)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.3.2) @@ -18097,6 +18834,20 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/core@10.3.2(@types/node@20.19.37)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.19.37) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.37 + optional: true + '@inquirer/core@10.3.2(@types/node@25.3.2)': dependencies: '@inquirer/ansi': 1.0.2 @@ -18126,6 +18877,11 @@ snapshots: '@inquirer/figures@1.0.15': {} + '@inquirer/type@3.0.10(@types/node@20.19.37)': + optionalDependencies: + '@types/node': 20.19.37 + optional: true + '@inquirer/type@3.0.10(@types/node@25.3.2)': optionalDependencies: '@types/node': 25.3.2 @@ -18170,14 +18926,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 25.3.2 + '@types/node': 25.5.0 jest-mock: 29.7.0 '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 25.3.2 + '@types/node': 25.5.0 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -18211,7 +18967,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -18762,11 +19518,13 @@ snapshots: '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 + optional: true '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 + optional: true '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -18782,17 +19540,20 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/propagator-jaeger@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + optional: true '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 + optional: true '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': dependencies: @@ -18800,6 +19561,7 @@ snapshots: '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 + optional: true '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': dependencies: @@ -18810,10 +19572,10 @@ snapshots: '@opentelemetry/propagator-jaeger': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) semver: 7.7.4 + optional: true - '@opentelemetry/semantic-conventions@1.28.0': {} - - '@opentelemetry/semantic-conventions@1.39.0': {} + '@opentelemetry/semantic-conventions@1.28.0': + optional: true '@orama/cuid2@2.2.3': dependencies: @@ -18829,6 +19591,8 @@ snapshots: lodash: 4.17.23 optional: true + '@oxc-project/types@0.114.0': {} + '@oxc-project/types@0.115.0': {} '@oxc-resolver/binding-android-arm-eabi@11.19.0': @@ -20351,7 +21115,7 @@ snapshots: '@react-native/codegen@0.84.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 hermes-parser: 0.32.0 invariant: 2.2.4 nullthrows: 1.1.1 @@ -20636,24 +21400,45 @@ snapshots: '@resvg/resvg-wasm@2.4.0': {} + '@rolldown/binding-android-arm64@1.0.0-rc.5': + optional: true + '@rolldown/binding-android-arm64@1.0.0-rc.8': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.5': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.8': optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.5': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.8': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.5': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.8': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.5': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.8': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.5': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.8': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.5': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.8': optional: true @@ -20663,34 +21448,72 @@ snapshots: '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.8': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.5': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.8': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-rc.5': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-rc.8': optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-rc.5': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-rc.8': optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.5': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.8': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.5': + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.8': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.5': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.8': optional: true '@rolldown/pluginutils@1.0.0-beta.40': {} + '@rolldown/pluginutils@1.0.0-rc.5': {} + '@rolldown/pluginutils@1.0.0-rc.8': {} + '@rollup/plugin-alias@5.1.1(rollup@4.59.0)': + optionalDependencies: + rollup: 4.59.0 + '@rollup/plugin-alias@6.0.0(rollup@4.59.0)': optionalDependencies: rollup: 4.59.0 + '@rollup/plugin-commonjs@28.0.9(rollup@4.59.0)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.5.0(picomatch@4.0.3) + is-reference: 1.2.1 + magic-string: 0.30.21 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.59.0 + '@rollup/plugin-commonjs@29.0.0(rollup@4.59.0)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.59.0) @@ -21446,7 +22269,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 ansis: 4.2.0 babel-dead-code-elimination: 1.0.12 @@ -21792,7 +22615,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -21804,7 +22627,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': @@ -21818,7 +22641,7 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/braces@3.0.5': {} @@ -21830,7 +22653,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/responselike': 1.0.3 '@types/chai@5.2.3': @@ -21840,11 +22663,11 @@ snapshots: '@types/concat-stream@2.0.3': dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/connect@3.4.38': dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/cookie@0.6.0': {} @@ -21981,7 +22804,7 @@ snapshots: '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -21998,7 +22821,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/hast@3.0.4': dependencies: @@ -22030,7 +22853,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/mdast@4.0.4': dependencies: @@ -22048,6 +22871,10 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/node@20.19.37': + dependencies: + undici-types: 6.21.0 + '@types/node@22.19.13': dependencies: undici-types: 6.21.0 @@ -22078,7 +22905,7 @@ snapshots: '@types/prompts@2.4.9': dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 kleur: 3.0.3 '@types/qs@6.14.0': {} @@ -22099,24 +22926,24 @@ snapshots: '@types/readable-stream@4.0.23': dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/resolve@1.20.2': {} '@types/responselike@1.0.3': dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/semver@7.7.1': {} '@types/send@1.2.1': dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/stack-utils@2.0.3': {} @@ -22154,13 +22981,17 @@ snapshots: '@types/whatwg-mimetype@3.0.2': {} + '@types/whatwg-url@11.0.5': + dependencies: + '@types/webidl-conversions': 7.0.3 + '@types/whatwg-url@13.0.0': dependencies: '@types/webidl-conversions': 7.0.3 '@types/ws@8.18.1': dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 '@types/yargs-parser@21.0.3': {} @@ -22170,7 +23001,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 optional: true '@typespec/ts-http-runtime@0.3.3': @@ -22290,7 +23121,7 @@ snapshots: '@vinxi/plugin-directives@0.5.1(vinxi@0.5.11(d9da12c5b87bf5fe7d8447a0cc903c3b))': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 acorn: 8.16.0 acorn-jsx: 5.3.2(acorn@8.16.0) acorn-loose: 8.5.2 @@ -22335,7 +23166,7 @@ snapshots: '@vitest/spy': 4.0.18 '@vitest/utils': 4.0.18 chai: 6.2.2 - tinyrainbow: 3.0.3 + tinyrainbow: 3.1.0 '@vitest/expect@4.1.0': dependencies: @@ -22364,6 +23195,15 @@ snapshots: msw: 2.12.10(@types/node@25.5.0)(typescript@5.9.3) vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + '@vitest/mocker@4.1.0(msw@2.12.10(@types/node@20.19.37)(typescript@5.9.3))(vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@vitest/spy': 4.1.0 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.12.10(@types/node@20.19.37)(typescript@5.9.3) + vite: 7.3.1(@types/node@20.19.37)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + '@vitest/mocker@4.1.0(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.1.0 @@ -22375,7 +23215,7 @@ snapshots: '@vitest/pretty-format@4.0.18': dependencies: - tinyrainbow: 3.0.3 + tinyrainbow: 3.1.0 '@vitest/pretty-format@4.1.0': dependencies: @@ -22435,7 +23275,7 @@ snapshots: '@vue/compiler-core@3.5.29': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@vue/shared': 3.5.29 entities: 7.0.1 estree-walker: 2.0.2 @@ -22448,7 +23288,7 @@ snapshots: '@vue/compiler-sfc@3.5.29': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@vue/compiler-core': 3.5.29 '@vue/compiler-dom': 3.5.29 '@vue/compiler-ssr': 3.5.29 @@ -22768,6 +23608,15 @@ snapshots: stubborn-fs: 2.0.0 when-exit: 2.1.5 + autoprefixer@10.4.27(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001774 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + aws-ssl-profiles@1.1.2: {} axios@1.13.5: @@ -22785,7 +23634,7 @@ snapshots: babel-dead-code-elimination@1.0.12: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 transitivePeerDependencies: @@ -22963,7 +23812,7 @@ snapshots: mailchecker: 6.0.19 validator: 13.15.26 - better-call@2.0.2(zod@4.3.6): + better-call@1.3.2(zod@4.3.6): dependencies: '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 @@ -23106,6 +23955,8 @@ snapshots: dependencies: node-int64: 0.4.0 + bson@6.10.4: {} + bson@7.2.0: {} buffer-crc32@0.2.13: {} @@ -23144,7 +23995,7 @@ snapshots: bun-types@1.3.9: dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 bundle-name@4.1.0: dependencies: @@ -23206,8 +24057,6 @@ snapshots: cac@6.7.14: {} - cac@7.0.0: {} - cacheable-lookup@5.0.4: {} cacheable-request@7.0.4: @@ -23254,6 +24103,13 @@ snapshots: dependencies: three: 0.183.2 + caniuse-api@3.0.0: + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001774 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + caniuse-lite@1.0.30001774: {} ccount@2.0.1: {} @@ -23359,7 +24215,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -23368,7 +24224,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -23512,6 +24368,8 @@ snapshots: color-string: 1.9.1 optional: true + colord@2.9.3: {} + colorette@1.4.0: optional: true @@ -23526,6 +24384,8 @@ snapshots: commander@10.0.1: {} + commander@11.1.0: {} + commander@12.1.0: {} commander@14.0.3: {} @@ -23799,6 +24659,10 @@ snapshots: css-color-keywords@1.0.0: {} + css-declaration-sorter@7.3.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + css-gradient-parser@0.0.16: {} css-gradient-parser@0.0.17: {} @@ -23817,10 +24681,68 @@ snapshots: css-color-keywords: 1.0.0 postcss-value-parser: 4.2.0 + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + css-what@6.2.2: {} cssesc@3.0.0: {} + cssnano-preset-default@7.0.11(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + css-declaration-sorter: 7.3.1(postcss@8.5.6) + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-calc: 10.1.1(postcss@8.5.6) + postcss-colormin: 7.0.6(postcss@8.5.6) + postcss-convert-values: 7.0.9(postcss@8.5.6) + postcss-discard-comments: 7.0.6(postcss@8.5.6) + postcss-discard-duplicates: 7.0.2(postcss@8.5.6) + postcss-discard-empty: 7.0.1(postcss@8.5.6) + postcss-discard-overridden: 7.0.1(postcss@8.5.6) + postcss-merge-longhand: 7.0.5(postcss@8.5.6) + postcss-merge-rules: 7.0.8(postcss@8.5.6) + postcss-minify-font-values: 7.0.1(postcss@8.5.6) + postcss-minify-gradients: 7.0.1(postcss@8.5.6) + postcss-minify-params: 7.0.6(postcss@8.5.6) + postcss-minify-selectors: 7.0.6(postcss@8.5.6) + postcss-normalize-charset: 7.0.1(postcss@8.5.6) + postcss-normalize-display-values: 7.0.1(postcss@8.5.6) + postcss-normalize-positions: 7.0.1(postcss@8.5.6) + postcss-normalize-repeat-style: 7.0.1(postcss@8.5.6) + postcss-normalize-string: 7.0.1(postcss@8.5.6) + postcss-normalize-timing-functions: 7.0.1(postcss@8.5.6) + postcss-normalize-unicode: 7.0.6(postcss@8.5.6) + postcss-normalize-url: 7.0.1(postcss@8.5.6) + postcss-normalize-whitespace: 7.0.1(postcss@8.5.6) + postcss-ordered-values: 7.0.2(postcss@8.5.6) + postcss-reduce-initial: 7.0.6(postcss@8.5.6) + postcss-reduce-transforms: 7.0.1(postcss@8.5.6) + postcss-svgo: 7.1.1(postcss@8.5.6) + postcss-unique-selectors: 7.0.5(postcss@8.5.6) + + cssnano-utils@5.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + cssnano@7.1.3(postcss@8.5.6): + dependencies: + cssnano-preset-default: 7.0.11(postcss@8.5.6) + lilconfig: 3.1.3 + postcss: 8.5.6 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + csstype@3.2.3: {} cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): @@ -24218,6 +25140,44 @@ snapshots: transitivePeerDependencies: - supports-color + drizzle-orm@0.38.4(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@types/react@19.2.14)(better-sqlite3@12.6.2)(bun-types@1.3.9)(kysely@0.28.11)(mysql2@3.18.2(@types/node@20.19.37))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(react@19.2.4): + optionalDependencies: + '@cloudflare/workers-types': 4.20260226.1 + '@electric-sql/pglite': 0.3.15 + '@libsql/client': 0.17.0(encoding@0.1.13) + '@opentelemetry/api': 1.9.0 + '@prisma/client': 5.22.0(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + '@types/better-sqlite3': 7.6.13 + '@types/pg': 8.16.0 + '@types/react': 19.2.14 + better-sqlite3: 12.6.2 + bun-types: 1.3.9 + kysely: 0.28.11 + mysql2: 3.18.2(@types/node@20.19.37) + pg: 8.19.0 + postgres: 3.4.8 + prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react: 19.2.4 + + drizzle-orm@0.38.4(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(@types/react@19.2.14)(better-sqlite3@12.6.2)(bun-types@1.3.9)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(react@19.2.4): + optionalDependencies: + '@cloudflare/workers-types': 4.20260226.1 + '@electric-sql/pglite': 0.3.15 + '@libsql/client': 0.17.0(encoding@0.1.13) + '@opentelemetry/api': 1.9.0 + '@prisma/client': 7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) + '@types/better-sqlite3': 7.6.13 + '@types/pg': 8.16.0 + '@types/react': 19.2.14 + better-sqlite3: 12.6.2 + bun-types: 1.3.9 + kysely: 0.28.11 + mysql2: 3.18.2(@types/node@25.5.0) + pg: 8.19.0 + postgres: 3.4.8 + prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react: 19.2.4 + drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.5.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260226.1 @@ -25074,6 +26034,12 @@ snapshots: path-exists: 4.0.0 optional: true + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.0 + rollup: 4.59.0 + fkill@9.0.0: dependencies: aggregate-error: 5.0.0 @@ -25128,6 +26094,8 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + fraction.js@5.3.4: {} + framer-motion@12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: motion-dom: 12.34.3 @@ -26152,7 +27120,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -26162,7 +27130,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.4 @@ -26215,7 +27183,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 25.3.2 + '@types/node': 25.5.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -26225,7 +27193,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 25.3.2 + '@types/node': 25.5.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -26252,7 +27220,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 25.3.2 + '@types/node': 25.5.0 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -26260,7 +27228,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 25.3.2 + '@types/node': 25.5.0 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -26277,7 +27245,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 25.3.2 + '@types/node': 25.5.0 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -26616,6 +27584,8 @@ snapshots: lilconfig@2.1.0: {} + lilconfig@3.1.3: {} + linebreak@1.1.0: dependencies: base64-js: 0.0.8 @@ -26692,10 +27662,14 @@ snapshots: lodash.isstring@4.0.1: {} + lodash.memoize@4.1.2: {} + lodash.once@4.1.1: {} lodash.throttle@4.1.1: {} + lodash.uniq@4.5.0: {} + lodash@4.17.21: {} lodash@4.17.23: {} @@ -26772,7 +27746,7 @@ snapshots: magicast@0.2.11: dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 recast: 0.23.11 @@ -26785,7 +27759,7 @@ snapshots: magicast@0.5.2: dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 source-map-js: 1.2.1 @@ -27069,6 +28043,10 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit: 5.1.0 + mdn-data@2.0.28: {} + + mdn-data@2.27.1: {} + media-typer@0.3.0: optional: true @@ -27492,7 +28470,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 flow-enums-runtime: 0.0.6 metro: 0.83.4 @@ -27581,7 +28559,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -28032,6 +29010,26 @@ snapshots: mkdirp@1.0.4: {} + mkdist@2.4.1(sass@1.97.1)(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)): + dependencies: + autoprefixer: 10.4.27(postcss@8.5.6) + citty: 0.1.6 + cssnano: 7.1.3(postcss@8.5.6) + defu: 6.1.4 + esbuild: 0.25.12 + jiti: 1.21.7 + mlly: 1.8.0 + pathe: 2.0.3 + pkg-types: 2.3.0 + postcss: 8.5.6 + postcss-nested: 7.0.2(postcss@8.5.6) + semver: 7.7.4 + tinyglobby: 0.2.15 + optionalDependencies: + sass: 1.97.1 + typescript: 5.9.3 + vue: 3.5.29(typescript@5.9.3) + mlly@1.8.0: dependencies: acorn: 8.16.0 @@ -28042,11 +29040,24 @@ snapshots: module-details-from-path@1.0.4: optional: true + mongodb-connection-string-url@3.0.2: + dependencies: + '@types/whatwg-url': 11.0.5 + whatwg-url: 14.2.0 + mongodb-connection-string-url@7.0.1: dependencies: '@types/whatwg-url': 13.0.0 whatwg-url: 14.2.0 + mongodb@6.21.0(socks@2.8.7): + dependencies: + '@mongodb-js/saslprep': 1.4.6 + bson: 6.10.4 + mongodb-connection-string-url: 3.0.2 + optionalDependencies: + socks: 2.8.7 + mongodb@7.1.0(socks@2.8.7): dependencies: '@mongodb-js/saslprep': 1.4.6 @@ -28077,6 +29088,32 @@ snapshots: ms@2.1.3: {} + msw@2.12.10(@types/node@20.19.37)(typescript@5.9.3): + dependencies: + '@inquirer/confirm': 5.1.21(@types/node@20.19.37) + '@mswjs/interceptors': 0.41.3 + '@open-draft/deferred-promise': 2.2.0 + '@types/statuses': 2.0.6 + cookie: 1.1.1 + graphql: 16.13.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.10.1 + statuses: 2.0.2 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.0 + type-fest: 5.4.4 + until-async: 3.0.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/node' + optional: true + msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3): dependencies: '@inquirer/confirm': 5.1.21(@types/node@25.3.2) @@ -28142,6 +29179,19 @@ snapshots: seq-queue: 0.0.5 sqlstring: 2.3.3 + mysql2@3.18.2(@types/node@20.19.37): + dependencies: + '@types/node': 20.19.37 + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.7.2 + long: 5.3.2 + lru.min: 1.1.4 + named-placeholders: 1.1.6 + sql-escaper: 1.3.3 + optional: true + mysql2@3.18.2(@types/node@25.5.0): dependencies: '@types/node': 25.5.0 @@ -28493,7 +29543,7 @@ snapshots: dependencies: citty: 0.2.1 pathe: 2.0.3 - tinyexec: 1.0.2 + tinyexec: 1.0.4 oauth2-mock-server@8.2.2: dependencies: @@ -28932,11 +29982,165 @@ snapshots: postal-mime@2.7.3: {} + postcss-calc@10.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 + + postcss-colormin@7.0.6(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-convert-values@7.0.9(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@7.0.6(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + + postcss-discard-duplicates@7.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-empty@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-overridden@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-merge-longhand@7.0.5(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + stylehacks: 7.0.8(postcss@8.5.6) + + postcss-merge-rules@7.0.8(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + + postcss-minify-font-values@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@7.0.1(postcss@8.5.6): + dependencies: + colord: 2.9.3 + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-params@7.0.6(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@7.0.6(postcss@8.5.6): + dependencies: + cssesc: 3.0.0 + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + + postcss-nested@7.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + + postcss-normalize-charset@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-normalize-display-values@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@7.0.6(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@7.0.2(postcss@8.5.6): + dependencies: + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@7.0.6(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + postcss: 8.5.6 + + postcss-reduce-transforms@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-svgo@7.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + svgo: 4.0.1 + + postcss-unique-selectors@7.0.5(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + postcss-value-parser@4.2.0: {} postcss@8.4.31: @@ -30659,7 +31863,7 @@ snapshots: robust-predicates@3.0.2: {} - rolldown-plugin-dts@0.22.4(oxc-resolver@11.19.0)(rolldown@1.0.0-rc.8)(typescript@5.9.3): + rolldown-plugin-dts@0.22.4(oxc-resolver@11.19.0)(rolldown@1.0.0-rc.5)(typescript@5.9.3): dependencies: '@babel/generator': 8.0.0-rc.2 '@babel/helper-validator-identifier': 8.0.0-rc.2 @@ -30670,12 +31874,31 @@ snapshots: dts-resolver: 2.1.3(oxc-resolver@11.19.0) get-tsconfig: 4.13.6 obug: 2.1.1 - rolldown: 1.0.0-rc.8 + rolldown: 1.0.0-rc.5 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver + rolldown@1.0.0-rc.5: + dependencies: + '@oxc-project/types': 0.114.0 + '@rolldown/pluginutils': 1.0.0-rc.5 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.5 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.5 + '@rolldown/binding-darwin-x64': 1.0.0-rc.5 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.5 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.5 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.5 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.5 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.5 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.5 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.5 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.5 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.5 + rolldown@1.0.0-rc.8: dependencies: '@oxc-project/types': 0.115.0 @@ -30697,6 +31920,17 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.8 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.8 + rollup-plugin-dts@6.4.0(rollup@4.59.0)(typescript@5.9.3): + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + convert-source-map: 2.0.0 + magic-string: 0.30.21 + rollup: 4.59.0 + typescript: 5.9.3 + optionalDependencies: + '@babel/code-frame': 7.29.0 + rollup-plugin-visualizer@6.0.5(rolldown@1.0.0-rc.8)(rollup@4.59.0): dependencies: open: 8.4.2 @@ -30828,8 +32062,7 @@ snapshots: sax@1.4.4: {} - sax@1.6.0: - optional: true + sax@1.6.0: {} scheduler@0.27.0: {} @@ -31360,6 +32593,12 @@ snapshots: optionalDependencies: '@babel/core': 7.29.0 + stylehacks@7.0.8(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + stylis@4.3.6: {} sucrase@3.35.1: @@ -31429,6 +32668,16 @@ snapshots: magic-string: 0.30.21 zimmerframe: 1.1.4 + svgo@4.0.1: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.2.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.0 + svix@1.84.1: dependencies: standardwebhooks: 1.0.0 @@ -31695,20 +32944,20 @@ snapshots: '@ts-morph/common': 0.28.1 code-block-writer: 13.0.3 - tsdown@0.21.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3): + tsdown@0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3): dependencies: ansis: 4.2.0 - cac: 7.0.0 + cac: 6.7.14 defu: 6.1.4 empathic: 2.0.0 hookable: 6.0.1 import-without-cache: 0.2.5 obug: 2.1.1 picomatch: 4.0.3 - rolldown: 1.0.0-rc.8 - rolldown-plugin-dts: 0.22.4(oxc-resolver@11.19.0)(rolldown@1.0.0-rc.8)(typescript@5.9.3) + rolldown: 1.0.0-rc.5 + rolldown-plugin-dts: 0.22.4(oxc-resolver@11.19.0)(rolldown@1.0.0-rc.5)(typescript@5.9.3) semver: 7.7.4 - tinyexec: 1.0.2 + tinyexec: 1.0.4 tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig-core: 7.5.0 @@ -31848,6 +33097,40 @@ snapshots: ultrahtml@1.6.0: {} + unbuild@3.6.1(sass@1.97.1)(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)): + dependencies: + '@rollup/plugin-alias': 5.1.1(rollup@4.59.0) + '@rollup/plugin-commonjs': 28.0.9(rollup@4.59.0) + '@rollup/plugin-json': 6.1.0(rollup@4.59.0) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.59.0) + '@rollup/plugin-replace': 6.0.3(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + esbuild: 0.25.12 + fix-dts-default-cjs-exports: 1.0.1 + hookable: 5.5.3 + jiti: 2.6.1 + magic-string: 0.30.21 + mkdist: 2.4.1(sass@1.97.1)(typescript@5.9.3)(vue@3.5.29(typescript@5.9.3)) + mlly: 1.8.0 + pathe: 2.0.3 + pkg-types: 2.3.0 + pretty-bytes: 7.1.0 + rollup: 4.59.0 + rollup-plugin-dts: 6.4.0(rollup@4.59.0)(typescript@5.9.3) + scule: 1.3.0 + tinyglobby: 0.2.15 + untyped: 2.0.0 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - sass + - vue + - vue-sfc-transformer + - vue-tsc + unconfig-core@7.5.0: dependencies: '@quansync/fs': 1.0.0 @@ -32351,6 +33634,25 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 + vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.59.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 20.19.37 + fsevents: 2.3.3 + jiti: 2.6.1 + less: 4.5.1 + lightningcss: 1.32.0 + sass: 1.97.1 + terser: 5.46.1 + tsx: 4.21.0 + yaml: 2.8.2 + vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 @@ -32478,6 +33780,36 @@ snapshots: - tsx - yaml + vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.37)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.7.0)(msw@2.12.10(@types/node@20.19.37)(typescript@5.9.3))(vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + '@vitest/expect': 4.1.0 + '@vitest/mocker': 4.1.0(msw@2.12.10(@types/node@20.19.37)(typescript@5.9.3))(vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.1.0 + '@vitest/runner': 4.1.0 + '@vitest/snapshot': 4.1.0 + '@vitest/spy': 4.1.0 + '@vitest/utils': 4.1.0 + es-module-lexer: 2.0.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 4.0.0 + tinybench: 2.9.0 + tinyexec: 1.0.4 + tinyglobby: 0.2.15 + tinyrainbow: 3.1.0 + vite: 7.3.1(@types/node@20.19.37)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + '@types/node': 20.19.37 + '@vitest/ui': 4.0.18(vitest@4.0.18) + happy-dom: 20.7.0 + transitivePeerDependencies: + - msw + vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.7.0)(msw@2.12.10(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@vitest/expect': 4.1.0 @@ -32753,7 +34085,7 @@ snapshots: xml2js@0.6.0: dependencies: - sax: 1.4.4 + sax: 1.6.0 xmlbuilder: 11.0.1 xml@1.0.1: {}