Merge branch 'canary' into tunis

This commit is contained in:
Taesu
2026-03-12 09:37:55 +09:00
committed by GitHub
36 changed files with 1297 additions and 230 deletions
+1
View File
@@ -40,3 +40,4 @@ vite
electronjs
wagmi
tldts
headimgurl
+34 -39
View File
@@ -1745,9 +1745,9 @@ packages:
resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
engines: {node: '>= 0.4'}
camelcase@6.3.0:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
camelcase@9.0.0:
resolution: {integrity: sha512-TO9xmyXTZ9HUHI8M1OnvExxYB0eYVS/1e5s7IDMTAoIcwUd+aNcFODs6Xk83mobk0velyHFQgA1yIrvYc6wclw==}
engines: {node: '>=20'}
caniuse-lite@1.0.30001775:
resolution: {integrity: sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==}
@@ -2002,11 +2002,11 @@ 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.0:
resolution: {integrity: sha512-7mtITW/we2/wTUZqMyBOR2F8xP4CRxMiSEcQxPIqdRWdO2L/HZSOlzoNyghmyDwNB8BDxePooV1ZTJpkOUhdRg==}
fast-xml-parser@5.4.2:
resolution: {integrity: sha512-pw/6pIl4k0CSpElPEJhDppLzaixDEuWui2CUQQBH/ECDf7+y6YwA4Gf7Tyb0Rfe4DIMuZipYj4AEL0nACKglvQ==}
fast-xml-parser@5.5.1:
resolution: {integrity: sha512-JTpMz8P5mDoNYzXTmTT/xzWjFiCWi0U+UQTJtrFH9muXsr2RqtXZPbnCW5h2mKsOd4u3XcPWCvDSrnaBPlUcMQ==}
hasBin: true
fetch-blob@3.2.0:
@@ -2377,10 +2377,6 @@ packages:
resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
node-forge@1.3.3:
resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==}
engines: {node: '>= 6.13.0'}
node-rsa@1.1.1:
resolution: {integrity: sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==}
@@ -2402,9 +2398,6 @@ packages:
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
pako@1.0.11:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
parseley@0.12.1:
resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==}
@@ -2412,6 +2405,10 @@ packages:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
path-expression-matcher@1.1.2:
resolution: {integrity: sha512-LXWqJmcpp2BKOEmgt4CyuESFmBfPuhJlAHKJsFzuJU6CxErWk75BrO+Ni77M9OxHN6dCYKM4vj+21Z6cOL96YQ==}
engines: {node: '>=14.0.0'}
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
@@ -2596,8 +2593,8 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
samlify@2.10.2:
resolution: {integrity: sha512-y5s1cHwclqwP8h7K2Wj9SfP1q+1S9+jrs5OAegYTLAiuFi7nDvuKqbiXLmUTvYPMpzHcX94wTY2+D604jgTKvA==}
samlify@2.11.0:
resolution: {integrity: sha512-1C9ukjlf0rRsuyqdzztqikdItqa33j9NCCDZgeBiWk0etU6vxNB+SWJKW4Flk07ZlhXeev/twALEKrPhIAyfDg==}
scheduler@0.27.0:
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
@@ -2771,10 +2768,6 @@ packages:
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
hasBin: true
uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
@@ -2830,6 +2823,10 @@ packages:
resolution: {integrity: sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA==}
engines: {node: '>=0.6.0'}
xpath@0.0.34:
resolution: {integrity: sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==}
engines: {node: '>=0.6.0'}
yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
@@ -2897,9 +2894,9 @@ snapshots:
'@better-fetch/fetch': 1.1.21
better-auth: link:../../packages/better-auth
better-call: 2.0.0-beta.4(zod@4.3.6)
fast-xml-parser: 5.4.2
fast-xml-parser: 5.5.1
jose: 6.1.3
samlify: 2.10.2
samlify: 2.11.0
zod: 4.3.6
'@better-auth/utils@0.3.1': {}
@@ -4262,7 +4259,7 @@ snapshots:
call-bind-apply-helpers: 1.0.2
get-intrinsic: 1.3.0
camelcase@6.3.0: {}
camelcase@9.0.0: {}
caniuse-lite@1.0.30001775: {}
@@ -4494,11 +4491,14 @@ snapshots:
fast-uri@3.1.0: {}
fast-xml-builder@1.0.0: {}
fast-xml-parser@5.4.2:
fast-xml-builder@1.1.0:
dependencies:
fast-xml-builder: 1.0.0
path-expression-matcher: 1.1.2
fast-xml-parser@5.5.1:
dependencies:
fast-xml-builder: 1.1.0
path-expression-matcher: 1.1.2
strnum: 2.2.0
fetch-blob@3.2.0:
@@ -4818,8 +4818,6 @@ snapshots:
fetch-blob: 3.2.0
formdata-polyfill: 4.0.10
node-forge@1.3.3: {}
node-rsa@1.1.1:
dependencies:
asn1: 0.2.6
@@ -4840,8 +4838,6 @@ snapshots:
dependencies:
wrappy: 1.0.2
pako@1.0.11: {}
parseley@0.12.1:
dependencies:
leac: 0.6.0
@@ -4849,6 +4845,8 @@ snapshots:
parseurl@1.3.3: {}
path-expression-matcher@1.1.2: {}
path-key@3.1.1: {}
path-to-regexp@8.3.0: {}
@@ -5033,19 +5031,16 @@ snapshots:
safer-buffer@2.1.2: {}
samlify@2.10.2:
samlify@2.11.0:
dependencies:
'@authenio/xml-encryption': 2.0.2
'@xmldom/xmldom': 0.8.11
camelcase: 6.3.0
node-forge: 1.3.3
camelcase: 9.0.0
node-rsa: 1.1.1
pako: 1.0.11
uuid: 8.3.2
xml: 1.0.1
xml-crypto: 6.1.2
xml-escape: 1.1.0
xpath: 0.0.32
xpath: 0.0.34
scheduler@0.27.0: {}
@@ -5236,8 +5231,6 @@ snapshots:
uuid@10.0.0: {}
uuid@8.3.2: {}
vary@1.1.2: {}
vaul@1.1.2(@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):
@@ -5290,6 +5283,8 @@ snapshots:
xpath@0.0.33: {}
xpath@0.0.34: {}
yallist@4.0.0: {}
zod-to-json-schema@3.25.1(zod@4.3.6):
@@ -0,0 +1,77 @@
---
title: WeChat
description: WeChat provider setup and usage.
---
<Steps>
<Step>
### Get your WeChat Credentials
To use WeChat sign in, you need to register a website application on the [WeChat Open Platform](https://open.weixin.qq.com/), set the `Authorization Callback Domain` to the better auth domain and get your App ID and App Secret.
</Step>
<Step>
### Configure the provider
To configure the provider, you need to import the provider and pass it to the `socialProviders` option of the auth instance.
```ts title="auth.ts"
import { betterAuth } from "better-auth"
export const auth = betterAuth({
socialProviders: {
wechat: { // [!code highlight]
clientId: process.env.WECHAT_CLIENT_ID, // [!code highlight]
clientSecret: process.env.WECHAT_CLIENT_SECRET, // [!code highlight]
}, // [!code highlight]
},
})
```
#### Optional Configuration
You can customize the WeChat provider with additional options:
```ts title="auth.ts"
export const auth = betterAuth({
socialProviders: {
wechat: {
clientId: process.env.WECHAT_CLIENT_ID,
clientSecret: process.env.WECHAT_CLIENT_SECRET,
// Optional: Set UI language for the WeChat login page
lang: "cn", // or "en" for English
// Optional: Use custom scopes
scope: [], // "snsapi_login" for web QR code login.
},
},
})
```
</Step>
<Step>
### Sign In with WeChat
To sign in with WeChat, you can use the `signIn.social` function provided by the client. The `signIn` function takes an object with the following properties:
- `provider`: The provider to use. It should be set to `wechat`.
```ts title="auth-client.ts"
import { createAuthClient } from "better-auth/client"
const authClient = createAuthClient()
const signIn = async () => {
const data = await authClient.signIn.social({
provider: "wechat"
})
}
```
</Step>
</Steps>
## Usage
### Platform Support
WeChat provider currently supports the Website Application platform type, which enables WeChat QR code login for web applications.
### Development Notes
- The redirect URL domain must match the domain configured in the WeChat Open Platform
+1 -1
View File
@@ -81,7 +81,7 @@ const { headers, response } = await auth.api.signUpEmail({
The `headers` will be a `Headers` object, which you can use to get the cookies or the headers.
```ts
const cookies = headers.get("set-cookie");
const cookies = headers.getSetCookie();
const headers = headers.get("x-custom-header");
```
@@ -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";
@@ -67,7 +67,7 @@ Or optionally, you can pass a `customAPIKeyGetter` function to the plugin option
```ts title="auth.ts"
import { betterAuth } from "better-auth"
import { apiKey } from "better-auth/plugins"
import { apiKey } from "@better-auth/api-key"
export const auth = betterAuth({
plugins: [
@@ -171,7 +171,7 @@ Default is `false`.
```ts title="auth.ts"
import { betterAuth } from "better-auth";
import { apiKey } from "better-auth/plugins"
import { apiKey } from "@better-auth/api-key"
export const auth = betterAuth({
secondaryStorage: {
@@ -202,7 +202,7 @@ Useful when you want to use a different storage backend specifically for API key
```ts title="auth.ts"
import { betterAuth } from "better-auth";
import { apiKey } from "better-auth/plugins"
import { apiKey } from "@better-auth/api-key"
export const auth = betterAuth({
plugins: [
@@ -307,7 +307,7 @@ You can configure default permissions that will be applied to all newly created
```ts title="auth.ts"
import { betterAuth } from "better-auth"
import { apiKey } from "better-auth/plugins"
import { apiKey } from "@better-auth/api-key"
export const auth = betterAuth({
plugins: [
@@ -327,7 +327,7 @@ You can also provide a function that returns permissions dynamically:
```ts title="auth.ts"
import { betterAuth } from "better-auth"
import { apiKey } from "better-auth/plugins"
import { apiKey } from "@better-auth/api-key"
export const auth = betterAuth({
plugins: [
+1
View File
@@ -913,6 +913,7 @@ stripe({
| `limits` | `object` | Limits for plan (e.g. `{ projects: 10, storage: 5 }`). |
| `group` | `string` | Defines the subscription lane for the plan. Plugin-managed flows allow one active or trialing subscription per `referenceId + group`. Omitted plans use `"default"`. |
| `seatPriceId` | `string` | Per-seat billing price ID. Requires the `organization` plugin. |
| `prorationBehavior` | `string` | Proration behavior on subscription updates: `"create_prorations"` (default), `"always_invoice"`, or `"none"`. |
| `lineItems` | `LineItem[]` | Additional line items to include in the checkout session. |
| `freeTrial` | `object` | Trial configuration. See [below](#free-trial-configuration). |
+1 -1
View File
@@ -5,7 +5,7 @@
"@better-auth/sso": "workspace:*",
"better-auth": "workspace:*",
"drizzle-orm": "^0.45.1",
"hono": "^4.12.4"
"hono": "^4.12.7"
},
"devDependencies": {
"@cloudflare/vitest-pool-workers": "^0.12.18",
+1 -1
View File
@@ -5,6 +5,6 @@
"dependencies": {
"@hono/node-server": "^1.19.10",
"better-auth": "workspace:*",
"hono": "^4.12.4"
"hono": "^4.12.7"
}
}
+12
View File
@@ -117,6 +117,18 @@
],
"project": ["src/**/*.ts", "test/**/*.ts"]
},
"packages/kysely-adapter": {
"ignoreDependencies": [
// optional peer dependency
"kysely"
]
},
"packages/mongo-adapter": {
"ignoreDependencies": [
// optional peer dependency
"mongodb"
]
},
"packages/stripe": {
"ignoreDependencies": [
// implicit dependencies
+18
View File
@@ -1136,6 +1136,24 @@ 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,
</svg>
),
},
{
title: "WeChat",
href: "/docs/authentication/wechat",
isNew: true,
icon: () => (
<svg
xmlns="http://www.w3.org/2000/svg"
width="1.2em"
height="1.2em"
viewBox="0 0 24 24"
>
<path
fill="currentColor"
d="M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.504c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.932-6.446 1.703-1.415 3.882-1.98 5.853-1.838-.576-3.583-4.196-6.348-8.596-6.348zM5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178 1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18zm5.34 2.867c-1.797-.052-3.746.512-5.28 1.786-1.72 1.428-2.687 3.72-1.78 6.22.942 2.453 3.666 4.229 6.884 4.229.826 0 1.622-.12 2.361-.336a.722.722 0 0 1 .598.082l1.584.926a.272.272 0 0 0 .14.047c.134 0 .24-.111.24-.247 0-.06-.023-.12-.038-.177l-.327-1.233a.582.582 0 0 1-.023-.156.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53 3.274c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.97-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982z"
/>
</svg>
),
},
{
title: "Zoom",
href: "/docs/authentication/zoom",
@@ -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(
{
@@ -84,6 +84,7 @@ export const requestPasswordReset = createAuthEndpoint(
},
},
},
use: [originCheck((ctx) => ctx.body.redirectTo)],
},
async (ctx) => {
if (!ctx.context.options.emailAndPassword?.sendResetPassword) {
@@ -41,6 +41,28 @@ type ReplaceAuthUserAndSession<
InferSessionFromClient<ClientOpts>
>;
type MergeCustomSessionField<
R extends object,
Field extends "user" | "session",
InferType,
> = Field extends keyof R
? {
[K in Field]: KeepNullishFromOriginal<
R[K],
NonNullable<R[K]> & InferType
>;
}
: {};
type MergeCustomSessionWithInferred<
R,
ClientOpts extends BetterAuthClientOptions,
> = R extends object
? Omit<R, "user" | "session"> &
MergeCustomSessionField<R, "user", InferUserFromClient<ClientOpts>> &
MergeCustomSessionField<R, "session", InferSessionFromClient<ClientOpts>>
: never;
type RefineAuthResponse<
Data,
ClientOpts extends BetterAuthClientOptions,
@@ -194,7 +216,10 @@ export type InferRoute<API, COpts extends BetterAuthClientOptions> =
Meta extends {
CUSTOM_SESSION: boolean;
}
? NonNullable<Awaited<R>>
? MergeCustomSessionWithInferred<
NonNullable<Awaited<R>>,
COpts
>
: T["path"] extends "/get-session"
? {
user: InferUserFromClient<COpts>;
@@ -3,6 +3,7 @@ import { createAuthClient } from "../../client";
import { parseSetCookieHeader } from "../../cookies";
import { getTestInstance } from "../../test-utils/test-instance";
import type { BetterAuthOptions } from "../../types";
import { inferAdditionalFields } from "../additional-fields/client";
import { admin } from "../admin";
import { adminClient } from "../admin/client";
import { multiSession } from "../multi-session";
@@ -300,4 +301,81 @@ describe("Custom Session Plugin Tests", async () => {
};
}>();
});
it("should not add user/session to client getSession type when custom session omits them", async () => {
const { auth } = await getTestInstance({
plugins: [
customSession(async () => {
return {
custom: {
field: "field",
},
};
}),
],
});
const client = createAuthClient({
plugins: [customSessionClient<typeof auth>()],
});
type SessionData = typeof client.$Infer.Session;
// When custom session omits user/session, the client type must not claim they exist
expectTypeOf<SessionData>().toEqualTypeOf<{
custom: {
field: string;
};
}>();
// Verify user and session are not in the type
expectTypeOf<keyof SessionData>().toEqualTypeOf<"custom">();
});
it("should infer both customSessionClient and inferAdditionalFields when combined", async () => {
const { auth } = await getTestInstance({
user: {
additionalFields: {
role: {
type: "string",
required: false,
},
},
},
plugins: [
customSession(async ({ user, session }) => {
return {
user: {
firstName: user.name.split(" ")[0],
lastName: user.name.split(" ")[1],
},
session,
customData: { message: "hello" },
};
}),
],
});
const client = createAuthClient({
plugins: [
customSessionClient<typeof auth>(),
inferAdditionalFields<typeof auth>(),
],
});
type SessionData = typeof client.$Infer.Session;
type User = SessionData["user"];
expectTypeOf<User>().toMatchObjectType<{
id: string;
firstName: string | undefined;
lastName: string | undefined;
role?: string | undefined | null;
}>();
type CustomData = SessionData["customData"];
expectTypeOf<CustomData>().toMatchObjectType<{
message: string;
}>();
});
});
@@ -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,
@@ -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,
});
}
}
@@ -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,
}) => {
@@ -33,6 +33,7 @@ import { twitch } from "./twitch";
import { twitter } from "./twitter";
import { vercel } from "./vercel";
import { vk } from "./vk";
import { wechat } from "./wechat";
import { zoom } from "./zoom";
export const socialProviders = {
@@ -70,6 +71,7 @@ export const socialProviders = {
polar,
railway,
vercel,
wechat,
};
export const socialProviderList = Object.keys(socialProviders) as [
@@ -126,6 +128,7 @@ export * from "./twitch";
export * from "./twitter";
export * from "./vercel";
export * from "./vk";
export * from "./wechat";
export * from "./zoom";
export type SocialProviderList = typeof socialProviderList;
@@ -0,0 +1,213 @@
import { betterFetch } from "@better-fetch/fetch";
import type { OAuth2Tokens, OAuthProvider, ProviderOptions } from "../oauth2";
/**
* WeChat user profile information
* @see https://developers.weixin.qq.com/doc/oplatform/en/Website_App/WeChat_Login/Wechat_Login.html
*/
export interface WeChatProfile extends Record<string, any> {
/**
* User's unique OpenID
*/
openid: string;
/**
* User's nickname
*/
nickname: string;
/**
* User's avatar image URL
*/
headimgurl: string;
/**
* User's privileges
*/
privilege: string[];
/**
* User's UnionID (unique across the developer's various applications)
*/
unionid?: string;
/** @note Email is currently unsupported by WeChat */
email?: string;
}
export interface WeChatOptions extends ProviderOptions<WeChatProfile> {
/**
* WeChat App ID
*/
clientId: string;
/**
* WeChat App Secret
*/
clientSecret: string;
/**
* Platform type for WeChat login
* - Currently only supports "WebsiteApp" for WeChat Website Application (网站应用)
* @default "WebsiteApp"
*/
platformType?: "WebsiteApp";
/**
* UI language for the WeChat login page
* cn for Simplified Chinese, en for English
* @default "cn" if left undefined
*/
lang?: "cn" | "en";
}
export const wechat = (options: WeChatOptions) => {
return {
id: "wechat",
name: "WeChat",
createAuthorizationURL({ state, scopes, redirectURI }) {
const _scopes = options.disableDefaultScope ? [] : ["snsapi_login"];
options.scope && _scopes.push(...options.scope);
scopes && _scopes.push(...scopes);
// WeChat uses non-standard OAuth2 parameters (appid instead of client_id)
// and requires a fragment (#wechat_redirect), so we construct the URL manually.
const url = new URL("https://open.weixin.qq.com/connect/qrconnect");
url.searchParams.set("scope", _scopes.join(","));
url.searchParams.set("response_type", "code");
url.searchParams.set("appid", options.clientId);
url.searchParams.set("redirect_uri", options.redirectURI || redirectURI);
url.searchParams.set("state", state);
url.searchParams.set("lang", options.lang || "cn");
url.hash = "wechat_redirect";
return url;
},
// WeChat uses non-standard token exchange (appid/secret instead of
// client_id/client_secret, GET instead of POST), so shared helpers
// like validateAuthorizationCode/getOAuth2Tokens cannot be used directly.
validateAuthorizationCode: async ({ code }) => {
const params = new URLSearchParams({
appid: options.clientId,
secret: options.clientSecret,
code: code,
grant_type: "authorization_code",
});
const { data: tokenData, error } = await betterFetch<{
access_token: string;
expires_in: number;
refresh_token: string;
openid: string;
scope: string;
unionid?: string;
errcode?: number;
errmsg?: string;
}>(
"https://api.weixin.qq.com/sns/oauth2/access_token?" +
params.toString(),
{
method: "GET",
},
);
if (error || !tokenData || tokenData.errcode) {
throw new Error(
`Failed to validate authorization code: ${tokenData?.errmsg || error?.message || "Unknown error"}`,
);
}
return {
tokenType: "Bearer" as const,
accessToken: tokenData.access_token,
refreshToken: tokenData.refresh_token,
accessTokenExpiresAt: new Date(
Date.now() + tokenData.expires_in * 1000,
),
scopes: tokenData.scope.split(","),
// WeChat requires openid for the userinfo endpoint, which is
// returned alongside the access token.
openid: tokenData.openid,
unionid: tokenData.unionid,
};
},
refreshAccessToken: options.refreshAccessToken
? options.refreshAccessToken
: async (refreshToken) => {
const params = new URLSearchParams({
appid: options.clientId,
grant_type: "refresh_token",
refresh_token: refreshToken,
});
const { data: tokenData, error } = await betterFetch<{
access_token: string;
expires_in: number;
refresh_token: string;
openid: string;
scope: string;
errcode?: number;
errmsg?: string;
}>(
"https://api.weixin.qq.com/sns/oauth2/refresh_token?" +
params.toString(),
{
method: "GET",
},
);
if (error || !tokenData || tokenData.errcode) {
throw new Error(
`Failed to refresh access token: ${tokenData?.errmsg || error?.message || "Unknown error"}`,
);
}
return {
tokenType: "Bearer" as const,
accessToken: tokenData.access_token,
refreshToken: tokenData.refresh_token,
accessTokenExpiresAt: new Date(
Date.now() + tokenData.expires_in * 1000,
),
scopes: tokenData.scope.split(","),
};
},
async getUserInfo(token) {
if (options.getUserInfo) {
return options.getUserInfo(token);
}
const openid = (token as OAuth2Tokens & { openid?: string }).openid;
if (!openid) {
return null;
}
const params = new URLSearchParams({
access_token: token.accessToken || "",
openid: openid,
lang: "zh_CN",
});
const { data: profile, error } = await betterFetch<
WeChatProfile & { errcode?: number; errmsg?: string }
>("https://api.weixin.qq.com/sns/userinfo?" + params.toString(), {
method: "GET",
});
if (error || !profile || profile.errcode) {
return null;
}
const userMap = await options.mapProfileToUser?.(profile);
return {
user: {
id: profile.unionid || profile.openid || openid,
name: profile.nickname,
email: profile.email || null,
image: profile.headimgurl,
emailVerified: false,
...userMap,
},
data: profile,
};
},
options,
} satisfies OAuthProvider<WeChatProfile, WeChatOptions>;
};
+5
View File
@@ -51,6 +51,11 @@
"@better-auth/utils": "^0.3.0",
"kysely": "^0.27.0 || ^0.28.0"
},
"peerDependenciesMeta": {
"kysely": {
"optional": true
}
},
"devDependencies": {
"@cloudflare/workers-types": "^4.20250121.0",
"@better-auth/core": "workspace:*",
+5
View File
@@ -46,6 +46,11 @@
"@better-auth/utils": "^0.3.0",
"mongodb": "^6.0.0 || ^7.0.0"
},
"peerDependenciesMeta": {
"mongodb": {
"optional": true
}
},
"devDependencies": {
"@better-auth/core": "workspace:*",
"@better-auth/utils": "^0.3.1",
@@ -148,6 +148,37 @@ describe("oauth authorize - unauthenticated", async () => {
`redirect_uri=${encodeURIComponent(redirectUri)}`,
);
});
it("should return login_required when prompt=none and user is not logged in", async () => {
if (!oauthClient?.client_id) {
throw Error("beforeAll not run properly");
}
const authUrl = new URL(`${authServerBaseUrl}/api/auth/oauth2/authorize`);
authUrl.searchParams.set("client_id", oauthClient.client_id);
authUrl.searchParams.set("redirect_uri", redirectUri);
authUrl.searchParams.set("response_type", "code");
authUrl.searchParams.set("scope", "openid");
authUrl.searchParams.set("state", "prompt-none-login-required");
authUrl.searchParams.set("prompt", "none");
authUrl.searchParams.set("code_challenge", generateRandomString(43));
authUrl.searchParams.set("code_challenge_method", "S256");
let callbackRedirectUrl = "";
await unauthenticatedClient.$fetch(authUrl.toString(), {
onError(context) {
callbackRedirectUrl = context.response.headers.get("Location") || "";
},
});
expect(callbackRedirectUrl).toContain(redirectUri);
expect(callbackRedirectUrl).toContain("error=login_required");
expect(callbackRedirectUrl).toContain("state=prompt-none-login-required");
expect(callbackRedirectUrl).toContain(
`iss=${encodeURIComponent(authServerBaseUrl)}`,
);
expect(callbackRedirectUrl).not.toContain("/login");
});
});
describe("oauth authorize - authenticated", async () => {
@@ -179,6 +210,7 @@ describe("oauth authorize - authenticated", async () => {
});
let oauthClient: OAuthClient | null;
let oauthClientNeedsConsent: OAuthClient | null;
const providerId = "test";
const redirectUri = `${rpBaseUrl}/api/auth/oauth2/callback/${providerId}`;
// Registers a confidential client application to work with
@@ -195,6 +227,19 @@ describe("oauth authorize - authenticated", async () => {
expect(response?.client_secret).toBeDefined();
expect(response?.redirect_uris).toEqual([redirectUri]);
oauthClient = response;
const responseNeedsConsent = await auth.api.adminCreateOAuthClient({
headers,
body: {
redirect_uris: [redirectUri],
skip_consent: false,
},
});
expect(responseNeedsConsent?.client_id).toBeDefined();
expect(responseNeedsConsent?.user_id).toBeDefined();
expect(responseNeedsConsent?.client_secret).toBeDefined();
expect(responseNeedsConsent?.redirect_uris).toEqual([redirectUri]);
oauthClientNeedsConsent = responseNeedsConsent;
});
it("should authorize and include iss parameter", async () => {
@@ -292,4 +337,35 @@ describe("oauth authorize - authenticated", async () => {
expect(issParam).toBe(metadataIssuer);
});
it("should return consent_required when prompt=none and consent is needed", async () => {
if (!oauthClientNeedsConsent?.client_id) {
throw Error("beforeAll not run properly");
}
const authUrl = new URL(`${authServerBaseUrl}/api/auth/oauth2/authorize`);
authUrl.searchParams.set("client_id", oauthClientNeedsConsent.client_id);
authUrl.searchParams.set("redirect_uri", redirectUri);
authUrl.searchParams.set("response_type", "code");
authUrl.searchParams.set("scope", "openid");
authUrl.searchParams.set("state", "prompt-none-consent-required");
authUrl.searchParams.set("prompt", "none");
authUrl.searchParams.set("code_challenge", generateRandomString(43));
authUrl.searchParams.set("code_challenge_method", "S256");
let callbackRedirectUrl = "";
await client.$fetch(authUrl.toString(), {
onError(context) {
callbackRedirectUrl = context.response.headers.get("Location") || "";
},
});
expect(callbackRedirectUrl).toContain(redirectUri);
expect(callbackRedirectUrl).toContain("error=consent_required");
expect(callbackRedirectUrl).toContain("state=prompt-none-consent-required");
expect(callbackRedirectUrl).toContain(
`iss=${encodeURIComponent(authServerBaseUrl)}`,
);
expect(callbackRedirectUrl).not.toContain("/consent");
});
});
+75
View File
@@ -21,6 +21,16 @@ import {
storeToken,
} from "./utils";
/**
* OIDC Error Codes
* @see https://openid.net/specs/openid-connect-core-1_0.html#AuthError
*/
type OIDCAuthError =
| "login_required"
| "consent_required"
| "interaction_required"
| "account_selection_required";
/**
* Formats an error url
*/
@@ -53,6 +63,25 @@ export const handleRedirect = (ctx: GenericEndpointContext, uri: string) => {
}
};
function redirectWithPromptNoneError(
ctx: GenericEndpointContext,
opts: OAuthOptions<Scope[]>,
query: OAuthAuthorizationQuery,
error: OIDCAuthError,
description: string,
) {
return handleRedirect(
ctx,
formatErrorURL(
query.redirect_uri,
error,
description,
query.state,
getIssuer(ctx, opts),
),
);
}
/**
* Validates that the issuer URL
* - MUST use HTTPS scheme (HTTP allowed for localhost in dev)
@@ -160,6 +189,7 @@ export async function authorizeEndpoint(
const promptSet = ctx.query?.prompt
? parsePrompt(ctx.query?.prompt)
: undefined;
const promptNone = promptSet?.has("none") ?? false;
if (promptSet?.has("select_account") && !opts.selectAccount?.page) {
throw ctx.redirect(
getErrorURL(
@@ -278,6 +308,15 @@ export async function authorizeEndpoint(
// Check for session
const session = await getSessionFromCtx(ctx);
if (!session || promptSet?.has("login") || promptSet?.has("create")) {
if (promptNone) {
return redirectWithPromptNoneError(
ctx,
opts,
query,
"login_required",
"authentication required",
);
}
return redirectWithPromptCode(
ctx,
opts,
@@ -302,6 +341,15 @@ export async function authorizeEndpoint(
scopes: requestedScopes,
});
if (selectedAccountRedirect) {
if (promptNone) {
return redirectWithPromptNoneError(
ctx,
opts,
query,
"account_selection_required",
"End-User account selection is required",
);
}
return redirectWithPromptCode(ctx, opts, "select_account");
}
}
@@ -315,6 +363,15 @@ export async function authorizeEndpoint(
scopes: requestedScopes,
});
if (signupRedirect) {
if (promptNone) {
return redirectWithPromptNoneError(
ctx,
opts,
query,
"interaction_required",
"End-User interaction is required",
);
}
return redirectWithPromptCode(
ctx,
opts,
@@ -332,6 +389,15 @@ export async function authorizeEndpoint(
scopes: requestedScopes,
});
if (postLoginRedirect) {
if (promptNone) {
return redirectWithPromptNoneError(
ctx,
opts,
query,
"interaction_required",
"End-User interaction is required",
);
}
return redirectWithPromptCode(ctx, opts, "post_login");
}
}
@@ -384,6 +450,15 @@ export async function authorizeEndpoint(
!consent ||
!requestedScopes.every((val) => consent.scopes.includes(val))
) {
if (promptNone) {
return redirectWithPromptNoneError(
ctx,
opts,
query,
"consent_required",
"End-User consent is required",
);
}
return redirectWithPromptCode(ctx, opts, "consent");
}
+7 -1
View File
@@ -107,7 +107,13 @@ describe("oauth metadata", async () => {
id_token_signing_alg_values_supported: ["EdDSA"],
end_session_endpoint: `${baseURL}/oauth2/end-session`,
acr_values_supported: ["urn:mace:incommon:iap:bronze"],
prompt_values_supported: ["login", "consent", "create", "select_account"],
prompt_values_supported: [
"login",
"consent",
"create",
"select_account",
"none",
],
});
const oauthMetadata = await auth.api.getOAuthServerConfig();
expect(oauthMetadata).toMatchObject(metadata ?? {});
+7 -1
View File
@@ -100,7 +100,13 @@ export function oidcServerMetadata(
: ["EdDSA"],
end_session_endpoint: `${baseURL}/oauth2/end-session`,
acr_values_supported: ["urn:mace:incommon:iap:bronze"],
prompt_values_supported: ["login", "consent", "create", "select_account"],
prompt_values_supported: [
"login",
"consent",
"create",
"select_account",
"none",
],
};
return metadata;
}
+103
View File
@@ -1164,6 +1164,109 @@ describe("oauth - prompt", async () => {
enableSelectAccount = false;
});
it("none - should return account_selection_required when account selection is required", async () => {
if (!oauthClient?.client_id || !oauthClient?.client_secret) {
throw Error("beforeAll not run properly");
}
enableSelectAccount = true;
try {
const { customFetchImpl: customFetchImplRP } = await createTestInstance({
prompt: "none",
});
const client = createAuthClient({
plugins: [genericOAuthClient()],
baseURL: rpBaseUrl,
fetchOptions: {
customFetchImpl: customFetchImplRP,
},
});
const data = await client.signIn.oauth2(
{
providerId,
callbackURL: "/success",
},
{
headers,
throw: true,
},
);
expect(data.url).toContain(`prompt=none`);
let callbackRedirectUri = "";
await serverClient.$fetch(data.url, {
method: "GET",
headers,
onError(context) {
callbackRedirectUri = context.response.headers.get("Location") || "";
},
});
expect(callbackRedirectUri).toContain(redirectUri);
expect(callbackRedirectUri).toContain("error=account_selection_required");
expect(callbackRedirectUri).toContain("state=");
expect(callbackRedirectUri).toContain(
`iss=${encodeURIComponent(authServerBaseUrl)}`,
);
expect(callbackRedirectUri).not.toContain("/select-account");
} finally {
enableSelectAccount = false;
}
});
it("none - should return interaction_required when post login is required", async () => {
if (!oauthClient?.client_id || !oauthClient?.client_secret) {
throw Error("beforeAll not run properly");
}
enableSelectAccount = false;
enablePostLogin = true;
try {
const { customFetchImpl: customFetchImplRP } = await createTestInstance({
prompt: "none",
});
const client = createAuthClient({
plugins: [genericOAuthClient()],
baseURL: rpBaseUrl,
fetchOptions: {
customFetchImpl: customFetchImplRP,
},
});
const data = await client.signIn.oauth2(
{
providerId,
callbackURL: "/success",
},
{
headers,
throw: true,
},
);
expect(data.url).toContain(`prompt=none`);
let callbackRedirectUri = "";
await serverClient.$fetch(data.url, {
method: "GET",
headers,
onError(context) {
callbackRedirectUri = context.response.headers.get("Location") || "";
},
});
expect(callbackRedirectUri).toContain(redirectUri);
expect(callbackRedirectUri).toContain("error=interaction_required");
expect(callbackRedirectUri).toContain("state=");
expect(callbackRedirectUri).toContain(
`iss=${encodeURIComponent(authServerBaseUrl)}`,
);
expect(callbackRedirectUri).not.toContain("/select-organization");
} finally {
enablePostLogin = false;
}
});
it("login+consent - should always redirect to login and force consent (notice consent previously given)", async ({
onTestFinished,
}) => {
+5 -4
View File
@@ -77,7 +77,7 @@ export const getPasskeyActions = (
data: null,
error: {
code: "AUTH_CANCELLED",
message: "auth cancelled",
message: PASSKEY_ERROR_CODES.AUTH_CANCELLED,
status: 400,
statusText: "BAD_REQUEST",
},
@@ -158,7 +158,7 @@ export const getPasskeyActions = (
data: null,
error: {
code: e.code,
message: "previously registered",
message: PASSKEY_ERROR_CODES.PREVIOUSLY_REGISTERED,
status: 400,
statusText: "BAD_REQUEST",
},
@@ -169,7 +169,7 @@ export const getPasskeyActions = (
data: null,
error: {
code: e.code,
message: "registration cancelled",
message: PASSKEY_ERROR_CODES.REGISTRATION_CANCELLED,
status: 400,
statusText: "BAD_REQUEST",
},
@@ -189,7 +189,8 @@ export const getPasskeyActions = (
data: null,
error: {
code: "UNKNOWN_ERROR",
message: e instanceof Error ? e.message : "unknown error",
message:
e instanceof Error ? e.message : PASSKEY_ERROR_CODES.UNKNOWN_ERROR,
status: 500,
statusText: "INTERNAL_SERVER_ERROR",
},
+4
View File
@@ -9,4 +9,8 @@ export const PASSKEY_ERROR_CODES = defineErrorCodes({
AUTHENTICATION_FAILED: "Authentication failed",
UNABLE_TO_CREATE_SESSION: "Unable to create session",
FAILED_TO_UPDATE_PASSKEY: "Failed to update passkey",
PREVIOUSLY_REGISTERED: "Previously registered",
REGISTRATION_CANCELLED: "Registration cancelled",
AUTH_CANCELLED: "Auth cancelled",
UNKNOWN_ERROR: "Unknown error",
});
+2
View File
@@ -21,6 +21,8 @@ declare module "@better-auth/core" {
}
}
export { PASSKEY_ERROR_CODES } from "./error-codes";
const MAX_AGE_IN_SECONDS = 60 * 5; // 5 minutes
export const passkey = (options?: PasskeyOptions | undefined) => {
+1 -1
View File
@@ -239,7 +239,7 @@ export const stripe = <O extends StripeOptions>(options: O) => {
await client.subscriptions.update(stripeSub.id, {
items,
proration_behavior: "create_prorations",
proration_behavior: plan.prorationBehavior ?? "create_prorations",
});
await ctx.adapter.update({
model: "subscription",
+7 -1
View File
@@ -1064,7 +1064,13 @@ export const upgradeSubscription = (options: StripeOptions) => {
try {
await client.subscriptions.update(activeSubscription.id, {
items: itemUpdates,
proration_behavior: "create_prorations",
proration_behavior: plan.prorationBehavior ?? "create_prorations",
})
.catch(async (e) => {
throw ctx.error("BAD_REQUEST", {
message: e.message,
code: e.code,
});
});
} catch (e) {
const err = e as { message?: string; code?: string };
+14
View File
@@ -81,6 +81,20 @@ export type StripePlan = {
* automatically sync the seat quantity in Stripe.
*/
seatPriceId?: string | undefined;
/**
* Proration behavior when updating this plan's subscription.
*
* Controls how Stripe handles mid-cycle price changes.
* - `create_prorations`: Add proration line items to the next invoice (default)
* - `always_invoice`: Create prorations and immediately invoice
* - `none`: No proration; new price applies at next billing cycle
*
* @default "create_prorations"
* @see https://docs.stripe.com/billing/subscriptions/prorations
*/
prorationBehavior?:
| Stripe.SubscriptionUpdateParams.ProrationBehavior
| undefined;
/**
* Additional line items to include in the checkout session.
*
@@ -516,6 +516,121 @@ describe("seat-based billing", () => {
expect(updateCall[1]!.proration_behavior).toBe("create_prorations");
});
it("should use custom prorationBehavior from plan config", async () => {
const customProrationOptions: StripeOptions = {
...seatPlanOptions,
subscription: {
enabled: true,
plans: [
{
priceId: "price_team_base",
name: "team",
seatPriceId: "price_team_seat",
prorationBehavior: "always_invoice",
},
{
priceId: "price_enterprise_base",
name: "enterprise",
seatPriceId: "price_enterprise_seat",
prorationBehavior: "always_invoice",
},
],
authorizeReference: async () => true,
},
};
const { client, auth, sessionSetter } = await getTestInstance(
{
plugins: [organization(), stripe(customProrationOptions)],
},
{
disableTestUser: true,
clientOptions: {
plugins: [
organizationClient(),
stripeClient({ subscription: true }),
],
},
},
);
const ctx = await auth.$context;
await client.signUp.email(
{
email: "proration-test@test.com",
password: "password",
name: "Proration User",
},
{ throw: true },
);
const headers = new Headers();
await client.signIn.email(
{ email: "proration-test@test.com", password: "password" },
{ throw: true, onSuccess: sessionSetter(headers) },
);
const org = await client.organization.create({
name: "Proration Org",
slug: "proration-org",
fetchOptions: { headers },
});
const orgId = org.data?.id as string;
await ctx.adapter.update({
model: "organization",
update: { stripeCustomerId: "cus_proration" },
where: [{ field: "id", value: orgId }],
});
await ctx.adapter.create({
model: "subscription",
data: {
referenceId: orgId,
stripeCustomerId: "cus_proration",
stripeSubscriptionId: "sub_proration",
status: "active",
plan: "team",
seats: 2,
},
});
mockStripe.subscriptions.list.mockResolvedValue({
data: [
{
id: "sub_proration",
status: "active",
cancel_at_period_end: false,
cancel_at: null,
items: {
data: [
{
id: "si_base",
price: { id: "price_team_base", lookup_key: null },
quantity: 1,
},
{
id: "si_seat",
price: { id: "price_team_seat", lookup_key: null },
quantity: 2,
},
],
},
},
],
});
const res = await client.subscription.upgrade({
plan: "enterprise",
customerType: "organization",
referenceId: orgId,
fetchOptions: { headers },
});
expect(res.data?.url).toBeDefined();
const updateCall = mockStripe.subscriptions.update.mock.calls[0]!;
expect(updateCall[1]!.proration_behavior).toBe("always_invoice");
});
it("should skip seat item swap when seat pricing is unchanged", async () => {
const sameSeatOptions: StripeOptions = {
...seatPlanOptions,
@@ -995,6 +1110,130 @@ describe("seat-based billing", () => {
expect.objectContaining({ id: "si_seat", quantity: 1 }),
);
});
it("should use custom prorationBehavior on member removal", async () => {
mockStripe.subscriptions.retrieve.mockResolvedValue({
id: "sub_seat_remove_proration",
status: "active",
items: {
data: [
{
id: "si_base",
price: { id: "price_team_base" },
quantity: 1,
},
{
id: "si_seat",
price: { id: "price_team_seat" },
quantity: 2,
},
],
},
});
const customProrationOptions: StripeOptions = {
...seatPlanOptions,
subscription: {
enabled: true,
plans: [
{
priceId: "price_team_base",
name: "team",
seatPriceId: "price_team_seat",
prorationBehavior: "none",
},
{
priceId: "price_enterprise_base",
name: "enterprise",
seatPriceId: "price_enterprise_seat",
prorationBehavior: "none",
},
],
authorizeReference: async () => true,
},
};
const { client, auth, sessionSetter } = await getTestInstance(
{
plugins: [organization(), stripe(customProrationOptions)],
},
{
disableTestUser: true,
clientOptions: {
plugins: [
organizationClient(),
stripeClient({ subscription: true }),
],
},
},
);
const ctx = await auth.$context;
await client.signUp.email(
{
email: "proration-remove@test.com",
password: "password",
name: "Proration Remove User",
},
{ throw: true },
);
const headers = new Headers();
await client.signIn.email(
{ email: "proration-remove@test.com", password: "password" },
{ throw: true, onSuccess: sessionSetter(headers) },
);
const org = await client.organization.create({
name: "Proration Remove Org",
slug: "proration-remove-org",
fetchOptions: { headers },
});
const orgId = org.data?.id as string;
await ctx.adapter.update({
model: "organization",
update: { stripeCustomerId: "cus_proration_remove" },
where: [{ field: "id", value: orgId }],
});
await ctx.adapter.create({
model: "subscription",
data: {
referenceId: orgId,
stripeCustomerId: "cus_proration_remove",
stripeSubscriptionId: "sub_seat_remove_proration",
status: "active",
plan: "team",
seats: 2,
},
});
const memberUser = await ctx.adapter.create({
model: "user",
data: { email: "proration-removable@test.com", name: "Removable" },
});
const member = await ctx.adapter.create({
model: "member",
data: {
userId: memberUser.id,
organizationId: orgId,
role: "member",
createdAt: new Date(),
},
});
await client.organization.removeMember({
memberIdOrEmail: member.id,
organizationId: orgId,
fetchOptions: { headers },
});
expect(mockStripe.subscriptions.update).toHaveBeenCalledWith(
"sub_seat_remove_proration",
expect.objectContaining({
proration_behavior: "none",
}),
);
});
});
describe("webhook seat handling", () => {
+150 -150
View File
@@ -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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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/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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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)(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.4.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.4.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(211ca8da8f7f1018663ab89a0cf5077c))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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(a10131c95cf7e0ba6b16b1f12a658513))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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(211ca8da8f7f1018663ab89a0cf5077c)
version: 0.5.11(a10131c95cf7e0ba6b16b1f12a658513)
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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
version: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.4.0)(typescript@5.9.3)
e2e/smoke/test/fixtures/cloudflare:
dependencies:
@@ -654,10 +654,10 @@ 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)(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.4.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.4
version: 4.12.5
specifier: ^4.12.7
version: 4.12.7
devDependencies:
'@cloudflare/vitest-pool-workers':
specifier: ^0.12.18
@@ -686,13 +686,13 @@ importers:
dependencies:
'@hono/node-server':
specifier: ^1.19.10
version: 1.19.11(hono@4.12.5)
version: 1.19.11(hono@4.12.7)
better-auth:
specifier: workspace:*
version: link:../../../../../packages/better-auth
hono:
specifier: ^4.12.4
version: 4.12.5
specifier: ^4.12.7
version: 4.12.7
e2e/smoke/test/fixtures/tsconfig-declaration:
dependencies:
@@ -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.4.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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
version: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
landing:
dependencies:
@@ -777,7 +777,7 @@ importers:
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(1b78cb9635f1622c0428a81b09f6eeb0)
version: 0.54.0(0641e63febbcd12aff52f2c9ed736642)
'@radix-ui/react-checkbox':
specifier: ^1.3.3
version: 1.3.3(@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)
@@ -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(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))
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.4.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
@@ -1061,7 +1061,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.4.0)
nanostores:
specifier: ^1.1.1
version: 1.1.1
@@ -1092,13 +1092,13 @@ importers:
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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
'@types/better-sqlite3':
specifier: ^7.6.13
version: 7.6.13
@@ -1128,7 +1128,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.4.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)
@@ -1161,7 +1161,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.32.0)(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.4.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.4.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vue:
specifier: ^3.5.29
version: 3.5.29(typescript@5.9.3)
@@ -1215,7 +1215,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.4.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
@@ -1331,7 +1331,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(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))
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.4.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)
@@ -1687,7 +1687,7 @@ importers:
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.4.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)
@@ -1724,7 +1724,7 @@ importers:
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.32.0)(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.4.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.4.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
test:
devDependencies:
@@ -1739,7 +1739,7 @@ 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.4.0)(typescript@5.9.3)
openid-client:
specifier: ^6.8.2
version: 6.8.2
@@ -1748,7 +1748,7 @@ importers:
version: 7.22.0
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.32.0)(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.4.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.4.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
packages:
@@ -4656,8 +4656,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.2':
resolution: {integrity: sha512-tIA8W/rC+Duz815uwoEaFTZ4oiIU478gE180hNREMWefJxBcZoS5GYky808FdGNbML2sxNX56LhkD20rSnUTbg==}
engines: {node: ^18.14.0 || >=20.6.1}
'@netlify/runtime-utils@2.2.1':
@@ -8040,8 +8040,8 @@ packages:
'@types/node@25.3.2':
resolution: {integrity: sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==}
'@types/node@25.3.3':
resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==}
'@types/node@25.4.0':
resolution: {integrity: sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==}
'@types/offscreencanvas@2019.7.3':
resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==}
@@ -11542,8 +11542,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:
@@ -18313,7 +18313,7 @@ snapshots:
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.32.0)(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.4.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.4.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
wrangler: 4.69.0(@cloudflare/workers-types@4.20260226.1)
transitivePeerDependencies:
- '@cloudflare/workers-types'
@@ -19461,25 +19461,25 @@ 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)':
'@hono/zod-openapi@1.2.2(hono@4.12.7)(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
'@hono/zod-validator': 0.7.6(hono@4.12.7)(zod@4.3.6)
hono: 4.12.7
openapi3-ts: 4.5.0
zod: 4.3.6
'@hono/zod-validator@0.7.6(hono@4.12.5)(zod@4.3.6)':
'@hono/zod-validator@0.7.6(hono@4.12.7)(zod@4.3.6)':
dependencies:
hono: 4.12.5
hono: 4.12.7
zod: 4.3.6
'@hookform/resolvers@5.2.2(react-hook-form@7.71.2(react@19.2.4))':
@@ -19591,7 +19591,7 @@ snapshots:
'@img/sharp-win32-x64@0.34.5':
optional: true
'@inkeep/agents-core@0.54.0(c35fa3d50074c0ae47b211ab383999b2)':
'@inkeep/agents-core@0.54.0(ac93cd682e6997680cde6e3fe049558b)':
dependencies:
'@ai-sdk/anthropic': 3.0.7(zod@4.3.6)
'@ai-sdk/azure': 3.0.38(zod@4.3.6)
@@ -19605,7 +19605,7 @@ snapshots:
'@better-auth/sso': 1.4.19(@better-auth/utils@0.3.0)(better-auth@1.4.19(37874412ccc7e51cb3cf44cf8d1a18ef))(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)
'@hono/zod-openapi': 1.2.2(hono@4.12.7)(zod@4.3.6)
'@modelcontextprotocol/sdk': 1.27.1(zod@4.3.6)
'@nangohq/node': 0.69.38
'@nangohq/types': 0.69.38
@@ -19623,7 +19623,7 @@ snapshots:
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)
exit-hook: 4.0.0
find-up: 7.0.0
hono: 4.12.5
hono: 4.12.7
iwanthue: 2.0.0
jmespath: 0.16.0
jose: 6.1.3
@@ -19694,11 +19694,11 @@ snapshots:
- vue
- ws
'@inkeep/ai-sdk-provider@0.54.0(1b78cb9635f1622c0428a81b09f6eeb0)':
'@inkeep/ai-sdk-provider@0.54.0(0641e63febbcd12aff52f2c9ed736642)':
dependencies:
'@ai-sdk/provider': 3.0.2
'@ai-sdk/provider-utils': 4.0.4(zod@4.3.6)
'@inkeep/agents-core': 0.54.0(c35fa3d50074c0ae47b211ab383999b2)
'@inkeep/agents-core': 0.54.0(ac93cd682e6997680cde6e3fe049558b)
zod: 4.3.6
transitivePeerDependencies:
- '@aws-sdk/client-rds-data'
@@ -19761,12 +19761,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.4.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.4.0)
'@inquirer/type': 3.0.10(@types/node@25.4.0)
optionalDependencies:
'@types/node': 25.3.3
'@types/node': 25.4.0
'@inquirer/core@10.3.2(@types/node@25.3.2)':
dependencies:
@@ -19782,18 +19782,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.4.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.4.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.4.0
'@inquirer/figures@1.0.15': {}
@@ -19802,9 +19802,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.4.0)':
optionalDependencies:
'@types/node': 25.3.3
'@types/node': 25.4.0
'@ioredis/commands@1.5.0': {}
@@ -20176,7 +20176,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
@@ -20186,7 +20186,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
@@ -20198,7 +20198,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
@@ -20208,7 +20208,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
@@ -20320,7 +20320,7 @@ snapshots:
'@netlify/blobs@10.5.0':
dependencies:
'@netlify/dev-utils': 4.3.3
'@netlify/otel': 5.1.1
'@netlify/otel': 5.1.2
'@netlify/runtime-utils': 2.2.1
transitivePeerDependencies:
- supports-color
@@ -20345,7 +20345,7 @@ snapshots:
write-file-atomic: 5.0.1
optional: true
'@netlify/otel@5.1.1':
'@netlify/otel@5.1.2':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
@@ -23674,11 +23674,11 @@ snapshots:
dependencies:
solid-js: 1.9.11
'@solidjs/start@1.3.2(solid-js@1.9.11)(vinxi@0.5.11(211ca8da8f7f1018663ab89a0cf5077c))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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(a10131c95cf7e0ba6b16b1f12a658513))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.32.0)(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(211ca8da8f7f1018663ab89a0cf5077c))
'@vinxi/server-components': 0.5.1(vinxi@0.5.11(211ca8da8f7f1018663ab89a0cf5077c))
'@tanstack/server-functions-plugin': 1.121.21(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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(a10131c95cf7e0ba6b16b1f12a658513))
'@vinxi/server-components': 0.5.1(vinxi@0.5.11(a10131c95cf7e0ba6b16b1f12a658513))
cookie-es: 2.0.0
defu: 6.1.4
error-stack-parser: 2.1.4
@@ -23690,8 +23690,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(211ca8da8f7f1018663ab89a0cf5077c)
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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
vinxi: 0.5.11(a10131c95cf7e0ba6b16b1f12a658513)
vite-plugin-solid: 2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
transitivePeerDependencies:
- '@testing-library/jest-dom'
- solid-js
@@ -23732,11 +23732,11 @@ snapshots:
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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
'@types/cookie': 0.6.0
acorn: 8.16.0
cookie: 0.6.0
@@ -23748,7 +23748,7 @@ 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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
optionalDependencies:
'@opentelemetry/api': 1.9.0
typescript: 5.9.3
@@ -23761,12 +23761,12 @@ snapshots:
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.0)(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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.0)(tsx@4.21.0)(yaml@2.8.2))':
dependencies:
@@ -23781,15 +23781,15 @@ snapshots:
- 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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.32.0)(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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
transitivePeerDependencies:
- supports-color
@@ -23870,7 +23870,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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
dependencies:
'@babel/code-frame': 7.26.2
'@babel/core': 7.29.0
@@ -23879,7 +23879,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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- supports-color
@@ -23939,19 +23939,19 @@ snapshots:
- 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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- '@rsbuild/core'
- crossws
@@ -24018,7 +24018,7 @@ snapshots:
- 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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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)
@@ -24035,8 +24035,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.32.0)(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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
transitivePeerDependencies:
- supports-color
@@ -24054,7 +24054,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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
dependencies:
'@babel/code-frame': 7.26.2
'@babel/core': 7.29.0
@@ -24063,7 +24063,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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
babel-dead-code-elimination: 1.0.12
tiny-invariant: 1.3.3
transitivePeerDependencies:
@@ -24124,17 +24124,17 @@ snapshots:
- 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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- '@rsbuild/core'
- '@tanstack/react-router'
@@ -24192,7 +24192,7 @@ snapshots:
- 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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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
@@ -24200,7 +24200,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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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
@@ -24212,8 +24212,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.32.0)(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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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:
@@ -24734,7 +24734,7 @@ snapshots:
dependencies:
undici-types: 7.18.2
'@types/node@25.3.3':
'@types/node@25.4.0':
dependencies:
undici-types: 7.18.2
@@ -24908,10 +24908,10 @@ snapshots:
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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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))':
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.32.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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
@@ -24973,7 +24973,7 @@ snapshots:
untun: 0.1.3
uqr: 0.1.2
'@vinxi/plugin-directives@0.5.1(vinxi@0.5.11(211ca8da8f7f1018663ab89a0cf5077c))':
'@vinxi/plugin-directives@0.5.1(vinxi@0.5.11(a10131c95cf7e0ba6b16b1f12a658513))':
dependencies:
'@babel/parser': 7.29.0
acorn: 8.16.0
@@ -24984,18 +24984,18 @@ snapshots:
magicast: 0.2.11
recast: 0.23.11
tslib: 2.8.1
vinxi: 0.5.11(211ca8da8f7f1018663ab89a0cf5077c)
vinxi: 0.5.11(a10131c95cf7e0ba6b16b1f12a658513)
'@vinxi/server-components@0.5.1(vinxi@0.5.11(211ca8da8f7f1018663ab89a0cf5077c))':
'@vinxi/server-components@0.5.1(vinxi@0.5.11(a10131c95cf7e0ba6b16b1f12a658513))':
dependencies:
'@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(211ca8da8f7f1018663ab89a0cf5077c))
'@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(a10131c95cf7e0ba6b16b1f12a658513))
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(211ca8da8f7f1018663ab89a0cf5077c)
vinxi: 0.5.11(a10131c95cf7e0ba6b16b1f12a658513)
'@vitest/coverage-istanbul@4.0.18(vitest@4.0.18)':
dependencies:
@@ -25031,14 +25031,14 @@ snapshots:
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.0)(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.32.0)(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.4.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
msw: 2.12.10(@types/node@25.4.0)(typescript@5.9.3)
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
'@vitest/pretty-format@4.0.18':
dependencies:
@@ -25066,7 +25066,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.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.0)(tsx@4.21.0)(yaml@2.8.2)
vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.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.4.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
'@vitest/utils@4.0.18':
dependencies:
@@ -26790,13 +26790,13 @@ 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)(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)(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.4.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.4.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)(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)(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.4.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.4.0)
debounce-fn@6.0.0:
dependencies:
@@ -26949,7 +26949,7 @@ snapshots:
dotenv-expand@11.0.7:
dependencies:
dotenv: 16.4.7
dotenv: 16.6.1
dotenv-expand@12.0.3:
dependencies:
@@ -26982,7 +26982,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.4.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
@@ -26995,7 +26995,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.4.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)
@@ -27018,7 +27018,7 @@ 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.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.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.4.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
@@ -27031,12 +27031,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.4.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)(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)(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.4.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
@@ -27049,7 +27049,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.4.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)
@@ -28133,7 +28133,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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)):
dependencies:
'@mdx-js/mdx': 3.1.1
'@standard-schema/spec': 1.1.0
@@ -28161,7 +28161,7 @@ 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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- supports-color
@@ -28771,7 +28771,7 @@ snapshots:
hono@4.11.4: {}
hono@4.12.5: {}
hono@4.12.7: {}
hookable@5.5.3: {}
@@ -31201,9 +31201,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.4.0)(typescript@5.9.3):
dependencies:
'@inquirer/confirm': 5.1.21(@types/node@25.3.3)
'@inquirer/confirm': 5.1.21(@types/node@25.4.0)
'@mswjs/interceptors': 0.41.3
'@open-draft/deferred-promise': 2.2.0
'@types/statuses': 2.0.6
@@ -31253,9 +31253,9 @@ snapshots:
sql-escaper: 1.3.3
optional: true
mysql2@3.18.2(@types/node@25.3.3):
mysql2@3.18.2(@types/node@25.4.0):
dependencies:
'@types/node': 25.3.3
'@types/node': 25.4.0
aws-ssl-profiles: 1.1.2
denque: 2.1.0
generate-function: 2.3.1
@@ -31332,7 +31332,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)(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)(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.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)(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)(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.4.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.4.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)
@@ -31353,7 +31353,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)(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)(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.4.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.4.0))
defu: 6.1.4
destr: 2.0.5
dot-prop: 10.1.0
@@ -31399,7 +31399,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)(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)(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)(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)(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.4.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.4.0)))(ioredis@5.9.3)
untyped: 2.0.0
unwasm: 0.5.3
youch: 4.1.0
@@ -34719,9 +34719,9 @@ snapshots:
dependencies:
js-tokens: 9.0.1
stripe@20.4.0(@types/node@25.3.3):
stripe@20.4.0(@types/node@25.4.0):
optionalDependencies:
'@types/node': 25.3.3
'@types/node': 25.4.0
strnum@1.1.2:
optional: true
@@ -35527,7 +35527,7 @@ snapshots:
optionalDependencies:
synckit: 0.11.11
unstorage@1.17.4(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(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)(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)(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)(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.4.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.4.0)))(ioredis@5.9.3):
dependencies:
anymatch: 3.1.3
chokidar: 5.0.0
@@ -35540,7 +35540,7 @@ snapshots:
optionalDependencies:
'@azure/identity': 4.13.0
'@netlify/blobs': 10.5.0
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)(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)(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.4.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.4.0))
ioredis: 5.9.3
until-async@3.0.2: {}
@@ -35699,7 +35699,7 @@ snapshots:
d3-time: 3.1.0
d3-timer: 3.0.1
vinxi@0.5.11(211ca8da8f7f1018663ab89a0cf5077c):
vinxi@0.5.11(a10131c95cf7e0ba6b16b1f12a658513):
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0)
@@ -35720,7 +35720,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)(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)(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.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)(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)(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.4.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.4.0))(rolldown@1.0.0-rc.8)
node-fetch-native: 1.6.7
path-to-regexp: 6.3.0
pathe: 1.1.2
@@ -35732,8 +35732,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)(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)(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.32.0)(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)(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)(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.4.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.4.0)))(ioredis@5.9.3)
vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
zod: 4.3.6
transitivePeerDependencies:
- '@azure/app-configuration'
@@ -35794,7 +35794,7 @@ snapshots:
- 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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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
@@ -35802,12 +35802,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.32.0)(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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
dependencies:
esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.3)
@@ -35816,7 +35816,7 @@ snapshots:
rollup: 4.59.0
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 25.3.3
'@types/node': 25.4.0
fsevents: 2.3.3
jiti: 2.6.1
less: 4.5.1
@@ -35845,7 +35845,7 @@ snapshots:
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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
dependencies:
esbuild: 0.27.3
fdir: 6.5.0(picomatch@4.0.3)
@@ -35854,7 +35854,7 @@ snapshots:
rollup: 4.59.0
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 25.3.3
'@types/node': 25.4.0
fsevents: 2.3.3
jiti: 2.6.1
less: 4.5.1
@@ -35869,9 +35869,9 @@ snapshots:
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.0)(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.32.0)(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.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(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.0)(tsx@4.21.0)(yaml@2.8.2):
dependencies:
@@ -35913,10 +35913,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.32.0)(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.4.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.4.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.0)(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.32.0)(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.4.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
'@vitest/pretty-format': 4.0.18
'@vitest/runner': 4.0.18
'@vitest/snapshot': 4.0.18
@@ -35933,11 +35933,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.32.0)(sass@1.97.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.0)(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.4.0
'@vitest/ui': 4.0.18(vitest@4.0.18)
happy-dom: 20.7.0
transitivePeerDependencies: