From cf10f920511f0a0f873022deeb2eddefb7dc5daf Mon Sep 17 00:00:00 2001 From: Jonathan Samines Date: Tue, 10 Mar 2026 17:47:18 -0600 Subject: [PATCH 01/13] chore: fix type inference when user and custom session plugins are combined (#8448) --- .../better-auth/src/client/path-to-object.ts | 27 ++++++- .../custom-session/custom-session.test.ts | 78 +++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/packages/better-auth/src/client/path-to-object.ts b/packages/better-auth/src/client/path-to-object.ts index c606357542..b4ee39d9f5 100644 --- a/packages/better-auth/src/client/path-to-object.ts +++ b/packages/better-auth/src/client/path-to-object.ts @@ -41,6 +41,28 @@ type ReplaceAuthUserAndSession< InferSessionFromClient >; +type MergeCustomSessionField< + R extends object, + Field extends "user" | "session", + InferType, +> = Field extends keyof R + ? { + [K in Field]: KeepNullishFromOriginal< + R[K], + NonNullable & InferType + >; + } + : {}; + +type MergeCustomSessionWithInferred< + R, + ClientOpts extends BetterAuthClientOptions, +> = R extends object + ? Omit & + MergeCustomSessionField> & + MergeCustomSessionField> + : never; + type RefineAuthResponse< Data, ClientOpts extends BetterAuthClientOptions, @@ -194,7 +216,10 @@ export type InferRoute = Meta extends { CUSTOM_SESSION: boolean; } - ? NonNullable> + ? MergeCustomSessionWithInferred< + NonNullable>, + COpts + > : T["path"] extends "/get-session" ? { user: InferUserFromClient; diff --git a/packages/better-auth/src/plugins/custom-session/custom-session.test.ts b/packages/better-auth/src/plugins/custom-session/custom-session.test.ts index dd8fc6fcf8..d6a87efb5b 100644 --- a/packages/better-auth/src/plugins/custom-session/custom-session.test.ts +++ b/packages/better-auth/src/plugins/custom-session/custom-session.test.ts @@ -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()], + }); + + type SessionData = typeof client.$Infer.Session; + + // When custom session omits user/session, the client type must not claim they exist + expectTypeOf().toEqualTypeOf<{ + custom: { + field: string; + }; + }>(); + + // Verify user and session are not in the type + expectTypeOf().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(), + inferAdditionalFields(), + ], + }); + + type SessionData = typeof client.$Infer.Session; + type User = SessionData["user"]; + + expectTypeOf().toMatchObjectType<{ + id: string; + firstName: string | undefined; + lastName: string | undefined; + role?: string | undefined | null; + }>(); + + type CustomData = SessionData["customData"]; + expectTypeOf().toMatchObjectType<{ + message: string; + }>(); + }); }); From 9fdd66251dec5755067d86b6bd98fd3d7d3a7fea Mon Sep 17 00:00:00 2001 From: Taesu <166604494+bytaesu@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:34:54 +0900 Subject: [PATCH 02/13] feat(stripe): allow customizable `prorationBehavior` per plan (#8525) --- docs/content/docs/plugins/stripe.mdx | 1 + packages/stripe/src/index.ts | 2 +- packages/stripe/src/routes.ts | 2 +- packages/stripe/src/types.ts | 14 + .../stripe/test/seat-based-billing.test.ts | 239 ++++++++++++++++++ 5 files changed, 256 insertions(+), 2 deletions(-) diff --git a/docs/content/docs/plugins/stripe.mdx b/docs/content/docs/plugins/stripe.mdx index 93123e6260..e474b589ab 100644 --- a/docs/content/docs/plugins/stripe.mdx +++ b/docs/content/docs/plugins/stripe.mdx @@ -874,6 +874,7 @@ stripe({ | `limits` | `object` | Limits for plan (e.g. `{ projects: 10, storage: 5 }`). | | `group` | `string` | A group name for categorizing plans. | | `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). | diff --git a/packages/stripe/src/index.ts b/packages/stripe/src/index.ts index 4b03a8f408..c3c10c7f55 100644 --- a/packages/stripe/src/index.ts +++ b/packages/stripe/src/index.ts @@ -239,7 +239,7 @@ export const stripe = (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", diff --git a/packages/stripe/src/routes.ts b/packages/stripe/src/routes.ts index d296754116..6e751f5728 100644 --- a/packages/stripe/src/routes.ts +++ b/packages/stripe/src/routes.ts @@ -908,7 +908,7 @@ export const upgradeSubscription = (options: StripeOptions) => { 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", { diff --git a/packages/stripe/src/types.ts b/packages/stripe/src/types.ts index d2381166c4..562e543a08 100644 --- a/packages/stripe/src/types.ts +++ b/packages/stripe/src/types.ts @@ -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. * diff --git a/packages/stripe/test/seat-based-billing.test.ts b/packages/stripe/test/seat-based-billing.test.ts index c174d8dc87..c677f7e3eb 100644 --- a/packages/stripe/test/seat-based-billing.test.ts +++ b/packages/stripe/test/seat-based-billing.test.ts @@ -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", () => { From c6fe68f2761846de544d109ac53402e8add51716 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 19:13:07 -0700 Subject: [PATCH 03/13] chore(deps): bump hono from 4.12.3 to 4.12.7 in /demo/nextjs (#8543) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- demo/nextjs/pnpm-lock.yaml | 73 ++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 39 deletions(-) diff --git a/demo/nextjs/pnpm-lock.yaml b/demo/nextjs/pnpm-lock.yaml index aa1de8304a..437d1bc370 100644 --- a/demo/nextjs/pnpm-lock.yaml +++ b/demo/nextjs/pnpm-lock.yaml @@ -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): From 58883e97b5f6c5d983e0ca2e2e9f219882c8fd7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 19:13:10 -0700 Subject: [PATCH 04/13] chore(deps): bump hono from 4.12.5 to 4.12.7 (#8541) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../test/fixtures/cloudflare/package.json | 2 +- e2e/smoke/test/fixtures/ipv6/package.json | 2 +- pnpm-lock.yaml | 300 +++++++++--------- 3 files changed, 152 insertions(+), 152 deletions(-) diff --git a/e2e/smoke/test/fixtures/cloudflare/package.json b/e2e/smoke/test/fixtures/cloudflare/package.json index 97a8c6d0bf..ae1b986f6f 100644 --- a/e2e/smoke/test/fixtures/cloudflare/package.json +++ b/e2e/smoke/test/fixtures/cloudflare/package.json @@ -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", diff --git a/e2e/smoke/test/fixtures/ipv6/package.json b/e2e/smoke/test/fixtures/ipv6/package.json index ae97dd8e64..76e80341ee 100644 --- a/e2e/smoke/test/fixtures/ipv6/package.json +++ b/e2e/smoke/test/fixtures/ipv6/package.json @@ -5,6 +5,6 @@ "dependencies": { "@hono/node-server": "^1.19.10", "better-auth": "workspace:*", - "hono": "^4.12.4" + "hono": "^4.12.7" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02c2bb88c7..29f25d8e2e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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: From 9dff8c5437bc441b26f1611ee4c97385443dc726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A9l=20Solano?= Date: Wed, 11 Mar 2026 03:15:22 +0100 Subject: [PATCH 05/13] fix(oidc-provider): validate redirect_uri for prompt=none (#8398) --- .../src/plugins/oidc-provider/authorize.ts | 31 ++++++- .../src/plugins/oidc-provider/error.ts | 13 ++- .../src/plugins/oidc-provider/oidc.test.ts | 81 +++++++++++++++---- 3 files changed, 103 insertions(+), 22 deletions(-) diff --git a/packages/better-auth/src/plugins/oidc-provider/authorize.ts b/packages/better-auth/src/plugins/oidc-provider/authorize.ts index f0804f4620..b9c6c8f76d 100644 --- a/packages/better-auth/src/plugins/oidc-provider/authorize.ts +++ b/packages/better-auth/src/plugins/oidc-provider/authorize.ts @@ -3,6 +3,7 @@ import { APIError } from "@better-auth/core/error"; import { isBrowserFetchRequest } from "@better-auth/core/utils/fetch-metadata"; import { getSessionFromCtx } from "../../api"; import { generateRandomString } from "../../crypto"; +import { InvalidClient, InvalidRequest } from "./error"; import { getClient } from "./index"; import type { AuthorizationQuery, OIDCOptions } from "./types"; import { parsePrompt } from "./utils/prompt"; @@ -58,15 +59,38 @@ export async function authorize( error: "invalid_request", }); } + const query = ctx.query as AuthorizationQuery; const session = await getSessionFromCtx(ctx); if (!session) { // Handle prompt=none per OIDC spec - must return error instead of redirecting - const query = ctx.query as AuthorizationQuery; const promptSet = parsePrompt(query.prompt ?? ""); - if (promptSet.has("none") && query.redirect_uri) { + if (promptSet.has("none")) { + if (!query.redirect_uri) { + throw new InvalidRequest( + "redirect_uri is required when prompt=none and must be usable to return errors without displaying UI", + ); + } + if (!query.client_id) { + throw new InvalidClient("client_id is required"); + } + const client = await getClient( + query.client_id, + options.trustedClients || [], + ); + if (!client) { + throw new InvalidClient("client_id is required"); + } + const validRedirectURI = client.redirectUrls.find( + (url) => url === query.redirect_uri, + ); + if (!validRedirectURI) { + throw new InvalidRequest( + "redirect_uri is invalid or not registered for this client", + ); + } return handleRedirect( formatErrorURL( - query.redirect_uri, + validRedirectURI, "login_required", "Authentication required but prompt is none", ), @@ -91,7 +115,6 @@ export async function authorize( return handleRedirect(`${options.loginPage}?${queryFromURL}`); } - const query = ctx.query as AuthorizationQuery; if (!query.client_id) { const errorURL = getErrorURL( ctx, diff --git a/packages/better-auth/src/plugins/oidc-provider/error.ts b/packages/better-auth/src/plugins/oidc-provider/error.ts index 696a803d9d..5d122e39c6 100644 --- a/packages/better-auth/src/plugins/oidc-provider/error.ts +++ b/packages/better-auth/src/plugins/oidc-provider/error.ts @@ -5,9 +5,20 @@ class OIDCProviderError extends APIError {} export class InvalidRequest extends OIDCProviderError { constructor(error_description: string, error_detail?: string) { super("BAD_REQUEST", { - message: "invalid_request", + message: error_description, + error: "invalid_request", error_description, error_detail, }); } } + +export class InvalidClient extends OIDCProviderError { + constructor(error_description: string) { + super("BAD_REQUEST", { + message: error_description, + error: "invalid_client", + error_description, + }); + } +} diff --git a/packages/better-auth/src/plugins/oidc-provider/oidc.test.ts b/packages/better-auth/src/plugins/oidc-provider/oidc.test.ts index 6ee3e60926..ffa1269339 100644 --- a/packages/better-auth/src/plugins/oidc-provider/oidc.test.ts +++ b/packages/better-auth/src/plugins/oidc-provider/oidc.test.ts @@ -460,24 +460,22 @@ describe("oidc", async () => { it("should return login_required error when prompt=none and user not authenticated", async ({ expect, }) => { - // Create an unauthenticated client - const unauthClient = createAuthClient({ - plugins: [oidcClient()], - baseURL: "http://localhost:3000", - fetchOptions: { - customFetchImpl, - }, + // Create an OAuth client + const testClient = await serverClient.oauth2.register({ + client_name: "test-login-required-prompt-none", + redirect_uris: [ + "http://localhost:3000/api/auth/oauth2/callback/login-required", + ], }); + const clientId = testClient.data?.client_id ?? ""; + const redirectUri = testClient.data?.redirect_uris?.[0] ?? ""; // Try to authorize with prompt=none const authUrl = new URL( "http://localhost:3000/api/auth/oauth2/authorize", ); - authUrl.searchParams.set("client_id", application.clientId); - authUrl.searchParams.set( - "redirect_uri", - application.redirectUrls[0] || "", - ); + authUrl.searchParams.set("client_id", clientId); + authUrl.searchParams.set("redirect_uri", redirectUri); authUrl.searchParams.set("response_type", "code"); authUrl.searchParams.set("scope", "openid profile email"); authUrl.searchParams.set("state", "test-state"); @@ -485,13 +483,11 @@ describe("oidc", async () => { authUrl.searchParams.set("code_challenge", "test-challenge"); authUrl.searchParams.set("code_challenge_method", "S256"); - let redirectURI = ""; - await unauthClient.$fetch(authUrl.toString(), { + const response = await customFetchImpl(authUrl.toString(), { method: "GET", - onError(context) { - redirectURI = context.response.headers.get("Location") || ""; - }, + redirect: "manual", }); + const redirectURI = response.headers.get("Location") || ""; expect(redirectURI).toContain("error=login_required"); expect(redirectURI).toContain("error_description=Authentication"); @@ -499,6 +495,57 @@ describe("oidc", async () => { expect(redirectURI).toContain("none"); }); + it("should not redirect to invalid redirect_uri when prompt=none", async ({ + expect, + }) => { + const attackerRedirect = "https://malicious.com/callback"; + const authUrl = new URL( + "http://localhost:3000/api/auth/oauth2/authorize", + ); + authUrl.searchParams.set("client_id", application.clientId); + authUrl.searchParams.set("redirect_uri", attackerRedirect); + authUrl.searchParams.set("response_type", "code"); + authUrl.searchParams.set("scope", "openid"); + authUrl.searchParams.set("state", "x"); + authUrl.searchParams.set("prompt", "none"); + + const response = await customFetchImpl(authUrl.toString(), { + method: "GET", + redirect: "manual", + }); + + const location = response.headers.get("Location") || ""; + expect(location === null || location === "").not.toContain( + "malicious.com", + ); + expect([400, 302]).toContain(response.status); + }); + + it("should return 400 invalid_request when prompt=none without redirect_uri", async ({ + expect, + }) => { + const authUrl = new URL( + "http://localhost:3000/api/auth/oauth2/authorize", + ); + authUrl.searchParams.set("client_id", application.clientId); + authUrl.searchParams.set("response_type", "code"); + authUrl.searchParams.set("scope", "openid"); + authUrl.searchParams.set("state", "x"); + authUrl.searchParams.set("prompt", "none"); + // No redirect_uri - must not fall through to login page + + const response = await customFetchImpl(authUrl.toString(), { + method: "GET", + redirect: "manual", + }); + + expect(response.status).toBe(400); + const location = response.headers.get("Location") || ""; + expect(location).not.toContain("/login"); + const body = await response.json().catch(() => ({})); + expect(body.error ?? body.code).toBe("invalid_request"); + }); + it("should return consent_required error when prompt=none and consent needed", async ({ expect, }) => { From 271af9bafce6a94416d329974f2dbc14d931271a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A9l=20Solano?= Date: Wed, 11 Mar 2026 05:06:54 +0100 Subject: [PATCH 06/13] fix: add origin check middleware to password reset request (#8392) --- .../src/api/routes/password.test.ts | 20 +++++++++++++++++++ .../better-auth/src/api/routes/password.ts | 1 + 2 files changed, 21 insertions(+) diff --git a/packages/better-auth/src/api/routes/password.test.ts b/packages/better-auth/src/api/routes/password.test.ts index ebb5c30056..ed3b110dce 100644 --- a/packages/better-auth/src/api/routes/password.test.ts +++ b/packages/better-auth/src/api/routes/password.test.ts @@ -37,6 +37,26 @@ describe("forget password", async () => { expect(token.length).toBeGreaterThan(10); }); + it("should reject untrusted redirectTo", async () => { + const { client, testUser } = await getTestInstance({ + emailAndPassword: { + enabled: true, + async sendResetPassword() {}, + }, + trustedOrigins: ["http://localhost:3000"], + advanced: { + disableOriginCheck: false, + }, + }); + const res = await client.requestPasswordReset({ + email: testUser.email, + redirectTo: "http://malicious.com", + }); + + expect(res.error?.status).toBe(403); + expect(res.error?.message).toBe("Invalid redirectURL"); + }); + it("should fail on invalid password", async () => { const res = await client.resetPassword( { diff --git a/packages/better-auth/src/api/routes/password.ts b/packages/better-auth/src/api/routes/password.ts index d6e247a7df..5a2b15a342 100644 --- a/packages/better-auth/src/api/routes/password.ts +++ b/packages/better-auth/src/api/routes/password.ts @@ -84,6 +84,7 @@ export const requestPasswordReset = createAuthEndpoint( }, }, }, + use: [originCheck((ctx) => ctx.body.redirectTo)], }, async (ctx) => { if (!ctx.context.options.emailAndPassword?.sendResetPassword) { From 686b69e7e63097e9f28417872fffea737f43f3da Mon Sep 17 00:00:00 2001 From: Zeljko Vranjes Date: Wed, 11 Mar 2026 12:29:36 -0400 Subject: [PATCH 07/13] docs: update SolidStart auth handler file path (#8470) --- docs/content/docs/integrations/solid-start.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/docs/integrations/solid-start.mdx b/docs/content/docs/integrations/solid-start.mdx index d833a33ceb..45963639d8 100644 --- a/docs/content/docs/integrations/solid-start.mdx +++ b/docs/content/docs/integrations/solid-start.mdx @@ -7,9 +7,9 @@ Before you start, make sure you have a Better Auth instance configured. If you h ### Mount the handler -We need to mount the handler to SolidStart server. Put the following code in your `*auth.ts` file inside `/routes/api/auth` folder. +We need to mount the handler to SolidStart server. Put the following code in your `[...auth].ts` file inside `/routes/api/auth` folder. -```ts title="*auth.ts" +```ts title="[...auth].ts" import { auth } from "~/lib/auth"; import { toSolidStartHandler } from "better-auth/solid-start"; From 542169b04a2902a6d16ce5e5e859002e233e25b2 Mon Sep 17 00:00:00 2001 From: Dylan Vanmali Date: Wed, 11 Mar 2026 11:02:37 -0700 Subject: [PATCH 08/13] fix(oauth-provider): support prompt=none (#8554) --- packages/oauth-provider/src/authorize.test.ts | 76 +++++++++++++ packages/oauth-provider/src/authorize.ts | 75 +++++++++++++ packages/oauth-provider/src/metadata.test.ts | 8 +- packages/oauth-provider/src/metadata.ts | 8 +- packages/oauth-provider/src/oauth.test.ts | 103 ++++++++++++++++++ 5 files changed, 268 insertions(+), 2 deletions(-) diff --git a/packages/oauth-provider/src/authorize.test.ts b/packages/oauth-provider/src/authorize.test.ts index 218b86ad04..d0cb415b19 100644 --- a/packages/oauth-provider/src/authorize.test.ts +++ b/packages/oauth-provider/src/authorize.test.ts @@ -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"); + }); }); diff --git a/packages/oauth-provider/src/authorize.ts b/packages/oauth-provider/src/authorize.ts index 561555b721..a6e1d896ff 100644 --- a/packages/oauth-provider/src/authorize.ts +++ b/packages/oauth-provider/src/authorize.ts @@ -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, + 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"); } diff --git a/packages/oauth-provider/src/metadata.test.ts b/packages/oauth-provider/src/metadata.test.ts index 8c0f2533d9..69ecc28cbe 100644 --- a/packages/oauth-provider/src/metadata.test.ts +++ b/packages/oauth-provider/src/metadata.test.ts @@ -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 ?? {}); diff --git a/packages/oauth-provider/src/metadata.ts b/packages/oauth-provider/src/metadata.ts index 213dec4385..37eab3dc3d 100644 --- a/packages/oauth-provider/src/metadata.ts +++ b/packages/oauth-provider/src/metadata.ts @@ -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; } diff --git a/packages/oauth-provider/src/oauth.test.ts b/packages/oauth-provider/src/oauth.test.ts index d3d38e44ac..28b1614fa7 100644 --- a/packages/oauth-provider/src/oauth.test.ts +++ b/packages/oauth-provider/src/oauth.test.ts @@ -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, }) => { From 6061bed1f811b63c832607e73beee3b56cfe55ee Mon Sep 17 00:00:00 2001 From: Yifan Song <41675306+Eric-Song-Nop@users.noreply.github.com> Date: Thu, 12 Mar 2026 02:07:06 +0800 Subject: [PATCH 09/13] feat(social-provider): add wechat social provider (#5189) Co-authored-by: Claude Co-authored-by: Alex Yang --- .cspell/third-party.txt | 1 + docs/content/docs/authentication/wechat.mdx | 77 +++++++ landing/components/sidebar-content.tsx | 18 ++ packages/core/src/social-providers/index.ts | 3 + packages/core/src/social-providers/wechat.ts | 213 +++++++++++++++++++ 5 files changed, 312 insertions(+) create mode 100644 docs/content/docs/authentication/wechat.mdx create mode 100644 packages/core/src/social-providers/wechat.ts diff --git a/.cspell/third-party.txt b/.cspell/third-party.txt index 50f31cd047..d2db5221ba 100644 --- a/.cspell/third-party.txt +++ b/.cspell/third-party.txt @@ -40,3 +40,4 @@ vite electronjs wagmi tldts +headimgurl diff --git a/docs/content/docs/authentication/wechat.mdx b/docs/content/docs/authentication/wechat.mdx new file mode 100644 index 0000000000..8c607979db --- /dev/null +++ b/docs/content/docs/authentication/wechat.mdx @@ -0,0 +1,77 @@ +--- +title: WeChat +description: WeChat provider setup and usage. +--- + + + + ### 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. + + + + ### 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. + }, + }, + }) + ``` + + + + ### 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" + }) + } + ``` + + + + +## 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 + diff --git a/landing/components/sidebar-content.tsx b/landing/components/sidebar-content.tsx index dd47217a72..4a9a80b1ca 100644 --- a/landing/components/sidebar-content.tsx +++ b/landing/components/sidebar-content.tsx @@ -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, ), }, + { + title: "WeChat", + href: "/docs/authentication/wechat", + isNew: true, + icon: () => ( + + + + ), + }, { title: "Zoom", href: "/docs/authentication/zoom", diff --git a/packages/core/src/social-providers/index.ts b/packages/core/src/social-providers/index.ts index 05aa005685..5b86f22522 100644 --- a/packages/core/src/social-providers/index.ts +++ b/packages/core/src/social-providers/index.ts @@ -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; diff --git a/packages/core/src/social-providers/wechat.ts b/packages/core/src/social-providers/wechat.ts new file mode 100644 index 0000000000..8e9681cb2e --- /dev/null +++ b/packages/core/src/social-providers/wechat.ts @@ -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 { + /** + * 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 { + /** + * 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; +}; From 574e7c2009f5521af5c073a2c4e74c6169f99096 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Wed, 11 Mar 2026 13:21:12 -0700 Subject: [PATCH 10/13] chore: mark third-party peerDependencies as optional in adapter packages (#8555) --- knip.jsonc | 12 ++++++++++++ packages/kysely-adapter/package.json | 5 +++++ packages/mongo-adapter/package.json | 5 +++++ 3 files changed, 22 insertions(+) diff --git a/knip.jsonc b/knip.jsonc index 755085773b..cbc7fc9ad2 100644 --- a/knip.jsonc +++ b/knip.jsonc @@ -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 diff --git a/packages/kysely-adapter/package.json b/packages/kysely-adapter/package.json index 01aa9f96cc..6483b6ccce 100644 --- a/packages/kysely-adapter/package.json +++ b/packages/kysely-adapter/package.json @@ -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:*", diff --git a/packages/mongo-adapter/package.json b/packages/mongo-adapter/package.json index 04e32c4602..49a843da57 100644 --- a/packages/mongo-adapter/package.json +++ b/packages/mongo-adapter/package.json @@ -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", From 5f673dd0ee545cf21fbe34d7458fe850d59223d5 Mon Sep 17 00:00:00 2001 From: Duki <72626889+DevDuki@users.noreply.github.com> Date: Wed, 11 Mar 2026 22:10:00 +0100 Subject: [PATCH 11/13] chore(passkey): use error codes in passkey client actions (#5831) Co-authored-by: Alex Yang --- packages/passkey/src/client.ts | 9 +++++---- packages/passkey/src/error-codes.ts | 4 ++++ packages/passkey/src/index.ts | 2 ++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/passkey/src/client.ts b/packages/passkey/src/client.ts index 10922321cf..2ea1db37ba 100644 --- a/packages/passkey/src/client.ts +++ b/packages/passkey/src/client.ts @@ -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", }, diff --git a/packages/passkey/src/error-codes.ts b/packages/passkey/src/error-codes.ts index bf724ae2d2..12ba1e3887 100644 --- a/packages/passkey/src/error-codes.ts +++ b/packages/passkey/src/error-codes.ts @@ -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", }); diff --git a/packages/passkey/src/index.ts b/packages/passkey/src/index.ts index 1f61327d28..97d4d3605f 100644 --- a/packages/passkey/src/index.ts +++ b/packages/passkey/src/index.ts @@ -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) => { From 72e124c69f66fb56173c6cca4c1b408f79757a62 Mon Sep 17 00:00:00 2001 From: Jo Burgard Date: Wed, 11 Mar 2026 22:45:43 +0100 Subject: [PATCH 12/13] docs: update api.mdx to improve cookies example (#5069) Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- docs/content/docs/concepts/api.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/docs/concepts/api.mdx b/docs/content/docs/concepts/api.mdx index e83d55c0ad..5aa35d50e8 100644 --- a/docs/content/docs/concepts/api.mdx +++ b/docs/content/docs/concepts/api.mdx @@ -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"); ``` From 764f63e1278aa8a1ab1c7a33c752ff045ed7bf75 Mon Sep 17 00:00:00 2001 From: nakkim <94118504+rurruur@users.noreply.github.com> Date: Thu, 12 Mar 2026 06:53:39 +0900 Subject: [PATCH 13/13] docs: fix api-key import path in api-key docs (#8545) --- docs/content/docs/plugins/api-key/advanced.mdx | 2 +- docs/content/docs/plugins/api-key/reference.mdx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/content/docs/plugins/api-key/advanced.mdx b/docs/content/docs/plugins/api-key/advanced.mdx index 53c93cc712..86c85664d8 100644 --- a/docs/content/docs/plugins/api-key/advanced.mdx +++ b/docs/content/docs/plugins/api-key/advanced.mdx @@ -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: [ diff --git a/docs/content/docs/plugins/api-key/reference.mdx b/docs/content/docs/plugins/api-key/reference.mdx index c92012fa18..af25739fc7 100644 --- a/docs/content/docs/plugins/api-key/reference.mdx +++ b/docs/content/docs/plugins/api-key/reference.mdx @@ -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: [